Справочник MQL4

Справочник MQL4 Вперед

Справочник MQL4

MetaQuotes Language 4 (MQL4) - встроенный язык программирования торговых стратегий, разработанный компанией MetaQuotes Ltd. на основе своего многолетнего опыта в создании торгово-информационных платформ. Этот язык позволяет писать собственные программы-эксперты (Expert Advisors), автоматизирующие управление торговыми процессами и идеально подходящие для реализации собственных торговых стратегий. Кроме того, на MQL4 можно создавать собственные технические индикаторы (Custom Indicators), скрипты (Scripts) и библиотеки функций (Libraries).

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

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

Программы, написанные на MetaQuotes Language 4, имеют различные свойства и предназначение:

  • Советник — это механическая торговая система (МТС), имеющая привязку к определенному графику. Советник запускается на выполнение при возникновении события, которое он может обработать: события инициализации и деинициализации, событие прихода нового тика, событие от таймера, событие от изменения стакана цен, события от графика и пользовательские события.
    Советник может не только работать в режиме информирования о возможности совершить сделку, но и автоматически совершать сделки на торговом счете, направляя их прямо на торговый сервер. Советники хранятся в директории каталог_терминала\MQL4\Experts.
  • Пользовательский индикатор — технический индикатор, самостоятельно написанный пользователем в дополнение к индикаторам, уже интегрированным в клиентский терминал. Пользовательские индикаторы, также как и встроенные, не могут автоматически торговать и предназначены только для реализации аналитических функций.
    Пользовательские индикаторы хранятся в директории каталог_терминала\MQL4\Indicators
  • Скрипт — программа, предназначенная для одноразового выполнения каких-либо действий. В отличие от экспертов, скрипты не обрабатывают никаких событий, кроме события запуска (для этого в скрипте должна быть функция-обработчик OnStart). Скрипты хранятся в директории каталог_терминала\MQL4\Scripts
  • Библиотека — библиотека пользовательских функций, предназначенная для хранения и распространения часто используемых блоков пользовательских программ. Библиотеки не могут самостоятельно запускаться на выполнение.
    Библиотеки хранятся в директории каталог_терминала\MQL4\Libraries
  • Включаемый файл — исходный текст часто используемых блоков пользовательских программ. Такие файлы могут включаться в исходные тексты экспертов, скриптов, пользовательских индикаторов и библиотек на этапе компиляции. Использование включаемых файлов более предпочтительно, чем использование библиотек, из-за дополнительных накладных расходов при вызове библиотечных функций.
    Включаемые файлы могут находиться в той же директории, что и исходный файл, в этом случае используется директива #include с двойными кавычками. Другое место хранения включаемых файлов – в директории каталог_терминала\MQL4\Include, в этом случае используется директива #include с угловыми скобками.

© 2000-2024, MetaQuotes Ltd


Возможности MQL5

Справочник MQL4 / Возможности MQL5

Возможности нового языка MQL5

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

Поздравляем Вас с отличным выбором и предлагаем познакомиться с преимуществами языка нового поколения – MQL5:

  • Графики цен можно полностью контролировать прямо из MQL5-программы – настраивать цвета, создавать панели управления, показывать собственные пользовательские символы и даже перемещать за пределы терминала.
  • Индикаторы получили 12 новых стилей рисования, 512 буферов и прямой расчет значений с индексацией из прошлого в будущее.
  • Советники можно отлаживать не только на графиках, но и в мультивалютном тестере. Теперь торговая логика в тестере и в онлайн торговле одинакова, вы можете тестировать комбинированную стратегию сразу на всех нужных валютных парах за один проход.

Высокая скорость языка MQL5

Новый MQL5 не уступает по скорости выполнения приложениям на С++, а сами MQL5-программы работают до 20 раз быстрее чем MQL4. Результаты выполнения стандартных тестов на языках MQL4, MQL5 и C++ подтверждают это. Чем ниже столбик, тем меньше времени затрачено на выполнение, тем лучше результат (время в миллисекундах ). Тесты проведены на Windows 10 (build 17763) x64, Xeon E5-2630 v4 @ 2.20GHz, Memory: 65457 Mb.

Сравнение скорости MQL5 vs MQL4 vs C++

С новыми асинхронными торговыми операциями вы получаете возможности алготрейдинга, которые раньше были доступны только избранным профессиональным трейдерам. Если вы пишете роботов на MQL5, то вам не нужны сторонние подключения к биржевым протоколам, вам не требуется размещать свои терминалы как можно ближе к брокеру — просто арендуйте встроенный VPS и отправьте туда торговать своего эксперта прямо из терминала. Низкие сетевые издержки, высокая скорость обновления стакана и асинхронная отсылка приказов в десятки раз ускоряют торговые операции. Такое ускорение может являться ключевым фактором для интрадей торговли.

Торговые роботы на событиях

Язык MQL5 стал полностью событийным, теперь всю торговую логику можно реализовать на обработке поступающих событий. В обработчике OnTick() вы анализируете поток тиков по любому символу, получаете сигнал на вход и отправляете асинхронный торговый запрос на совершение сделки – через долю миллисекунды вы уже продолжаете выполнение программы и готовы провести сделку уже на другом символе. Нет никаких потерь времени на ожидание результата операции. Потому что данные о торговых операциях вы получаете и обрабатываете в другом обработчике – OnTradeTransaction(). Это позволяет писать торговые алгоритмы с максимальной надежностью и эффективностью.

События используются не только для совершения торговых операций, но и для других задач:

  • получение обновлений стакана цен, анализ изменений цен/объемов в заявках и торговля по результатам анализа;
  • создание вспомогательных аналитических инструментов и панелей управления для MQL5-программ;
  • управление оптимизацией и визуализация полученных данных прямо в режиме реального времени.

Тестирование мультивалютных экспертов

В MQL5 вы можете не только писать советников, которые торгуют одновременно на множестве символов, но и проверять таких экспертов в тестере стратегий. При этом корректно обрабатываются функция Sleep(), событие таймера и специальные события для работы в режиме оптимизации. Отладку советников и профилирование советников можно проводить в визуальном режиме тестирования.

Познакомьтесь с возможностями языка MQL5 и создавайте программы для алготрейдинга на новом уровне!


Графики

Справочник MQL4 / Возможности MQL5 / Графики

Графики в MQL5

В платформе пятого поколения в 2 разa больше таймфреймов (21 против 9) и есть точная шкала времени – теперь графические объекты не обязательно привязывать к барам. Точки объектов могут быть расположены в любой позиции между барами графика. При этом при переключении между таймфреймами сохраняется точное позиционирование контрольных точек объекта. Добавлены новые встроенные индикаторы и аналитические инструменты.

Для проведения комплексного технического анализа наиболее интересным является новый графический объект OBJ_CHART. С его помощью вы можете создать сколь угодно вложенных графиков и задать им все необходимые свойства – цветую схему, таймфрейм, символ и даже наложить на них индикаторы. Таким образом, привычный ценовой график можно превратить в комплексный аналитический инструмент, быстро переключаясь по клику мышки между символами и таймфреймами.

Если вы используете для торговли несколько мониторов, то оцените ещё одно преимуществом новой платформы – плавающие окна графиков. Теперь любой график символа можно открепить от окна терминала и перенести его на нужный монитор. Пример такого графика показан на рисунке. Добавьте на плавающий график индикаторы и советника с графической панелью, и вы получите настоящий центр управления торговлей. Перемещать и изменять размеры плавающих окон можно также из MQL5-программы – с помощью свойств графика (CHART_IS_DOCKED и другие).

Третьей отличительной чертой платформы пятого поколения является возможность создавать пользовательские символы или синтетические индексы. Для этого достаточно ввести формулу расчета или загрузить файлы с минутными барами или тиковой историей. Работать с собственными символами можно и средствами языка MQL5. С помощью соответствующих функций можно автоматизировать рутинные операции по сбору и подготовке исторических данных, открывать графики и обновлять их в режиме реального времени, а также тестировать на пользовательских символах своих советников в тестере стратегий.

Познакомьтесь с возможностями языка MQL5 и пишите программы на новом уровне.


Индикаторы

Справочник MQL4 / Возможности MQL5 / Индикаторы

Индикаторы в MQL5

В MQL5 количество встроенных технических индикаторов увеличено с 30 до 38, а количество стилей рисования пользовательских индикаторов выросло в 3 раза – с 6 до 18. Теперь пользовательский индикатор может использовать до 512 индикаторных буферов, при этом для цветных стилей можно задать свой цвет отрисовки на каждом баре.

Функциями MQL5 можно устанавливать цвета и показ отдельных элементов графика, добавлять на график символа объект "График" (OBJ_CHART) с любого другого символа/таймфрейма, накладывать на него другие индикаторы. Для создания пользовательского интерфейса также можно рисовать на канвасе, управлять индикатором с помощью клавиатуры и мышки, и многое-многое другое.

Таким образом, с МQL5 возможности для создания индикаторов и любых инструментов технического анализа просто безграничны.


Советники

Справочник MQL4 / Возможности MQL5 / Советники

Советники в MQL5

Новая платформа позволяет тестировать советников на реальных тиках, при этом максимально точно воспроизводится всё торговое окружение, синхронизируются тики по всем используемым инструментам с точностью до миллисекунд. Тестер стратегий является мультипоточным и позволяет использовать все ядра локального компьютера, агентов из локальной сети и сеть MQL5 Cloud Network. Это позволяет в десятки и сотни раз ускорить разработку и отладку торговых стратегий.

Новый тестер также является мультирыночным – он позволяет тестировать стратегии, которые торгуют одновременно на нескольких финансовых инструментах. При запуске мультивалютного тестирования с торгового сервера автоматически загружается вся необходимая история по всем используемым символам, корректно обрабатываются события таймера и вызовы функции Sleep(). Таким образом, вы пишете один и тот же код как для тестирования, так и для реальной торговли – теперь нет никаких ограничений со стороны тестера и вам не придется тестировать каждый инструмент мультивалютного советника по отдельности.

Платформа пятого поколения позволяет ускорить торговые операции: компилятор языка MQL5 агрессивно оптимизирует получаемый исполняемый EX5-код, асинхронная функция OrderSendAsync исполняется за доли миллисекунды, обработка ордеров на торговом сервере происходит за минимальное время, обновления цен и стакана заявок доставляются в терминал без задержек. Для торговли на биржевых инструментах вам пригодятся функции по работе с тиками и доступ к стакану цен.

Язык MQL5 по скорости сравнялся с языком С++, а сами MQL5-программы работают до 20 раз быстрее чем MQL4, так как все функции нового языка написаны с учетом возможностей современных процессоров и результатов профилирования кода. При необходимости можно еще больше ускорить вычисления с помощью функций OpenCL – среда разработки MetaEditor изначально поддерживает интерфейс OpenCL для использования мощностей современных видеокарт.


Функции MQL5

Справочник MQL4 / Возможности MQL5 / Функции MQL5

Список функций языка MQL5

Все функции MQL5 по разделам

Раздел | Описание
Общие функции | Функции общего назначения, которые не вошли ни в одну из специализированных групп
Операции с массивами | Функции для работы с массивами. Допускаются не более чем четырехмерные массивы
Преобразование данных | Функции для преобразования данных из одного формата в данные другого формата
Математические функции | Набор математических и тригонометрических функций
Строковые функции | Функции для работы с данными типа string
Дата и время | Функции для работы с данными типа datetime (целое число, представляющее собой количество секунд, прошедших с 0 часов 1 января 1970 года)
Информация о счете | Фукнкции для получения информации о текущем торговом счете
Проверка состояния | Функции для получения текущего состояния клиентского терминала
Обработка событий | Функции для обработки предопределенных событий языка MQL5
Получение рыночной информации | Функции для получения информации о состоянии рынка
Экономический календарь | Функции для работы с событиями Экономического календаря
Доступ к таймсериям и индикаторам | Функции для работы с таймсериями и индикаторами. Индексация элементов в таймсерии производится от от самых свежих данных к самым старым
Пользовательские символы | Функции для создания и редактирования свойств пользовательских символов
Операции с графиками | Функции для работы с графиками. Изменение свойств графика производится в процессе обработки очереди событий данного графика
Торговые функции | Функции для проведения торговых операция и получения информации об ордерах, позициях, сделках
Управление сигналами | Функции для управления торговыми сигналами
Сетевые функции | Функции для работы с почтой, FTP, push-уведомлениями, HTTP-запросами и удаленными серверами
Глобальные переменные терминала | Функции для работы с глобальными переменными клиентского терминала
Файловые операции | Функции для работы с файлами и "именованными каналами"
Пользовательские индикаторы | Функции для установки свойств в пользовательских индикаторах
Графические объекты | Функции для работы с графическими объектами, относящимися к указанному графику
Технические индикаторы | Функции для создания технического индикатора и получения его хендла. Если индикатор уже существует, то новая копия не создается
Работа с результатами оптимизации | Функции для обработки результатов оптимизации в тестере стратегий
Работа с событиями | Функции для работы с пользовательскими событиями и событиями таймера
Работа с OpenCL | Функции для работы с программами на OpenCL


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

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Общие функции

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

Функции общего назначения, которые не вошли ни в одну из специализированных групп.

Функция | Действие
Alert | Выводит сообщение в отдельном окне
CheckPointer | Возвращает тип указателя объекта
Comment | Выводит сообщение в левый верхний угол ценового графика
CryptEncode | Преобразует данные массива-источника в массив-приемник указанным методом
CryptDecode | Производит обратное преобразование данных массива
DebugBreak | Программная точка останова при отладке
ExpertRemove | Прекращает работу эксперта и выгружает его с графика
GetPointer | Возвращает указатель объекта
GetTickCount | Возвращает количество миллисекунд, прошедших с момента старта системы
GetMicrosecondCount | Возвращает количество микросекунд, прошедших с момента начала работы MQL5-программы
MessageBox | Создает и отображает окно сообщений, а также управляет им
PeriodSeconds | Возвращает количество секунд в периоде
PlaySound | Воспроизводит звуковой файл
Print | Выводит сообщение в журнал
PrintFormat | Форматирует и печатает наборы символов и значений в лог-файл в соответствие с заданным форматом
ResetLastError | Устанавливает значение предопределенной переменной _LastError в ноль
ResourceCreate | Создает ресурс изображения на основе набора данных
ResourceFree | Удаляет динамически созданный ресурс (освобождает занятую ресурсом память)
ResourceReadImage | Читает данные графического ресурса, созданного функцией ResourceCreate() или сохраненного в EX5-файле при компиляции
ResourceSave | Сохраняет ресурс в указанный файл
SetUserError | Устанавливает предопределенную переменную _LastError в значение, равное ERR_USER_ERROR_FIRST + user_error
SetReturnError | Устанавливает код возврата, который вернёт процесс терминала при завершение работы
Sleep | Задерживает выполнение текущего эксперта или скрипта на определенный интервал
TerminalClose | Посылает терминалу команду на завершение работы
TesterHideIndicators | Задает режим показа/сокрытия индикаторов, которые используются в эксперте
TesterStatistics | Возвращает значение указанного статистического показателя, рассчитанного по результатам тестирования
TesterStop | Отдает команду на завершении работы программы при тестировании.
TesterWithdrawal | Эмуляция операций снятия средств в процессе тестирования
TranslateKey | Возвращает Unicode-символ по виртуальному коду клавиши
ZeroMemory | Обнуляет переменную, переданную по ссылке. Тип переменной может быть любым, исключение составляют только классы и структуры, имеющие конструкторы


Операции с массивами

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Операции с массивами

Группа функций для работы с массивами

Допускаются не более чем четырехмерные массивы. Индексация каждого измерения производится от 0 до размер_измерения-1. В частном случае одномерного массива из 50 элементов обращение к первому элементу будет выглядеть как array[0], к последнему элементу - array[49].

Функция | Действие
ArrayBsearch | Возвращает индекс первого найденного элемента в первом измерении массива
ArrayCopy | Копирует один массив в другой
ArrayCompare | Возвращает результат сравнения двух массивов простых типов или пользовательских структур, не имеющих сложных объектов
ArrayFree | Освобождает буфер любого динамического массива и устанавливает размер нулевого измерения в 0 (ноль)
ArrayGetAsSeries | Проверяет направление индексации массива
ArrayInitialize | Устанавливает все элементы числового массива в одну величину
ArrayFill | Заполняет числовой массив указанным значением
ArrayIsSeries | Проверяет, является ли массив таймсерией
ArrayIsDynamic | Проверяет, является ли массив динамическим
ArrayMaximum | Поиск элемента с максимальным значением
ArrayMinimum | Поиск элемента с минимальным значением
ArrayPrint | Выводит в журнал массив простого типа или простой структуры
ArrayRange | Возвращает число элементов в указанном измерении массива
ArrayResize | Устанавливает новый размер в первом измерении массива
ArrayInsert | Вставляет в массив-приемник из массива-источника указанное число элементов
ArrayRemove | Удаляет из массива указанное число элементов начиная с указанного индекса
ArrayReverse | Разворачивает в массиве указанное число элементов начиная с указанного индекса
ArraySetAsSeries | Устанавливает направление индексирования в массиве
ArraySize | Возвращает количество элементов в массиве
ArraySort | Сортировка числовых массивов по первому измерению
ArraySwap | Обменивает между собой содержимое двух динамических массивов одного типа


Преобразование данных

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Преобразование данных

Преобразование данных

Группа функций, обеспечивающих преобразование данных из одного формата в данные другого формата.

Функция | Действие
CharToString | Преобразование кода символа в односимвольную строку
DoubleToString | Преобразование числового значения в текстовую строку с указанной точностью
EnumToString | Преобразование значения перечисления любого типа в строку
NormalizeDouble | Округление числа с плавающей точкой до указанной точности
StringToDouble | Преобразование строки, содержащей символьное представление числа, в число типа double
StringToInteger | Преобразование строки, содержащей символьное представление числа, в число типа int
StringToTime | Преобразование строки, содержащей время и/или дату в формате "yyyy.mm.dd [hh:mi]", в число типа datetime
TimeToString | Преобразование значения, содержащего время в секундах, прошедшее с 01.01.1970, в строку формата "yyyy.mm.dd hh:mi"
IntegerToString | Преобразование значения целого типа в строку указанной длины
ShortToString | Преобразование код символа (unicode) в односимвольную строку
ShortArrayToString | Копирует часть массива в строку
StringToShortArray | Посимвольно копирует строку в указанное место массива типа ushort
CharArrayToString | Преобразует код символа (ansi) в односимвольную строку
StringToCharArray | Посимвольно копирует преобразованную из Unicode в ANSI строку в указанное место массива типа uchar
CharArrayToStruct | Копирует POD-структуру в массив типа uchar
StructToCharArray | Копирует POD-структуру в массив типа uchar
ColorToARGB | Преобразует тип color в тип uint для получения ARGB-представления цвета.
ColorToString | Преобразует значение цвета в строку вида "R,G,B"
StringToColor | Преобразует строку типа "R,G,B" или строку, содержащую наименование цвета, в значение типа color
StringFormat | Преобразует число в строку в соответствие с заданным форматом


Математические функции

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Математические функции

Математические функции

Набор математических и тригонометрических функций.

Функция | Действие
MathAbs | Возвращает абсолютное значение (значение по модулю) переданного ей числа
MathArccos | Возвращает значение арккосинуса x в радианах
MathArcsin | Возвращает значение арксинуса x в радианах
MathArctan | Возвращает арктангенс x в радианах
MathCeil | Возвращает ближайшее сверху целое числовое значение
MathCos | Возвращает косинус числа
MathExp | Возвращает экспоненту числа
MathFloor | Возвращает ближайшее снизу целое числовое значение
MathLog | Возвращает натуральный логарифм
MathLog10 | Возвращает логарифм числа по основанию 10
MathMax | Возвращает максимальное из двух числовых значений
MathMin | Возвращает минимальное из двух числовых значений
MathMod | Возвращает вещественный остаток от деления двух чисел
MathPow | Возводит основание в указанную степень
MathRand | Возвращает псевдослучайное целое число в диапазоне от 0 до 32767
MathRound | Округляет число до ближайшего целого
MathSin | Возвращает синус числа
MathSqrt | Возвращает квадратный корень
MathSrand | Устанавливает начальное состояние генератора псевдослучайных целых чисел
MathTan | Возвращает тангенс числа
MathIsValidNumber | Проверяет корректность действительного числа
MathExpm1 | Возвращает значение выражения MathExp(x)-1
MathLog1p | Возвращает значение выражения MathLog(1+x)
MathArccosh | Возвращает значение гиперболического арккосинуса
MathArcsinh | Возвращает значение гиперболического арксинуса
MathArctanh | Возвращает значение гиперболического арктангенса
MathCosh | Возвращает гиперболический косинус
MathSinh | Возвращает гиперболический синус
MathTanh | Возвращает гиперболический тангенс
MathSwap | Меняет порядок байтов в значении типа ushort/uint/ulong


Строковые функции

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Строковые функции

Строковые функции

Группа функций, предназначенных для работы с данными типа string.

Функция | Действие
StringAdd | Присоединяет к концу строки по месту указанную подстроку
StringBufferLen | Возвращает размер буфера, распределенного для строки
StringCompare | Сравнивает две строки и возвращает 1, если первая строка больше второй; 0 - если строки равны; -1 (минус один) - если первая строка меньше второй
StringConcatenate | Формирует строку из переданных параметров
StringFill | Заполняет указанную строку по месту указанными символами
StringFind | Поиск подстроки в строке
StringGetCharacter | Возвращает значение символа, расположенного в указанной позиции строки
StringInit | Инициализирует строку указанными символами и обеспечивает указанный размер строки
StringLen | Возвращает число символов в строке
StringSetLength | Устанавливает для строки указанную длину в символах
StringReplace | Заменяет в строке все найденные подстроки на заданную последовательность символов.
StringReserve | Резервирует в памяти для строки буфер указанного размера
StringSetCharacter | Возвращает копию строки с измененным значением символа в указанной позиции
StringSplit | Получает из указанной строки подстроки по заданному разделителю и возвращает количество полученных подстрок
StringSubstr | Извлекает подстроку из текстовой строки, начинающейся c указанной позиции
StringToLower | Преобразует все символы указанной строки в строчные (маленькие) по месту
StringToUpper | Преобразует все символы указанной строки в прописные (большие) по месту
StringTrimLeft | Удаляет символы перевода каретки, пробелы и символы табуляции с начала строки
StringTrimRight | Удаляет символы перевода каретки, пробелы и символы табуляции в конце строки


Дата и время

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Дата и время

Дата и время

Группа функций, обеспечивающих работу с данными типа datetime (целое число, представляющее собой количество секунд, прошедших с 0 часов 1 января 1970 года).

Функция | Действие
TimeCurrent | Возвращает последнее известное время сервера (время прихода последней котировки) в формате datetime
TimeTradeServer | Возвращает расчетное текущее время торгового сервера
TimeLocal | Возвращает локальное компьютерное время в формате datetime
TimeGMT | Возвращает время GMT формате datetime с учетом перехода на зимнее или летнее время по локальному времени компьютера, на котором запущен клиентский терминал
TimeDaylightSavings | Возвращает признак перехода на летнее /зимнее время
TimeGMTOffset | Возвращает текущую разницу между временем GMT и локальным временем компьютера в секундах с учетом перехода на зимнее или летнее время
TimeToStruct | Производит конвертацию из значения типа datetime в переменную типа структуры MqlDateTime
StructToTime | Производит конвертацию из переменной типа структуры MqlDateTime в значение типа datetime


Информация о счете

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Информация о счете

Информация о счете

Функции, возвращающие параметры текущего счета.

Функция | Действие
AccountInfoDouble | Возвращает значение типа double соответствующего свойства счета
AccountInfoInteger | Возвращает значение целочисленного типа (bool,int или long) соответствующего свойства счета
AccountInfoString | Возвращает значение типа string соответствующего свойства счета


Проверка состояния

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Проверка состояния

Проверка состояния

Функции, возвращающие параметры текущего состояния клиентского терминала

Функция | Действие
GetLastError | Возвращает значение последней ошибки
IsStopped | Возвращает true, если поступила команда завершить выполнение mql5-программы
UninitializeReason | Возвращает код причины деинициализации
TerminalInfoInteger | Возвращает значение целого типа соответствующего свойства окружения mql5-программы
TerminalInfoDouble | Возвращает значение типа double соответствующего свойства окружения mql5-программы
TerminalInfoString | Возвращает значение типа string соответствующего свойства окружения mql5-программы
MQLInfoInteger | Возвращает значение целого типа соответствующего свойства запущенной mql5-программы
MQLInfoString | Возвращает значение типа string соответствующего свойства запущенной mql5-программы
Symbol | Возвращает имя символа текущего графика.
Period | Возвращает значение таймфрейма текущего графика
Digits | Возвращает количество десятичных знаков после запятой, определяющее точность измерения цены символа текущего графика
Point | Возвращает размер пункта текущего инструмента в валюте котировки.


Обработка событий

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Обработка событий

Обработка событий

В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события.

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

Функция | Описание
OnStart | Вызывается в скрипте при наступлении события Start для выполнения действий, заложенных в скрипт
OnInit | Вызывается в индикаторах и экспертах при наступлении события Init для инициализации запущенной MQL5-программы
OnDeinit | Вызывается в индикаторах и экспертах при наступлении события Deinit для деинициализации запущенной MQL5-программы
OnTick | Вызывается в экспертах при наступлении события NewTick для обработки новой котировки
OnCalculate | Вызывается в индикаторах при наступлении события Calculate для обработки изменения ценовых данных
OnTimer | Вызывается в индикаторах и экспертах при наступлении периодического события Timer, которое с заданным интервалом времени генерируется терминалом
OnTrade | Вызывается в экспертах при наступлении события Trade, которое генерируется при завершении торговой операции на торговом сервере
OnTradeTransaction | Вызывается в экспертах при наступлении события TradeTransaction для обработки результатов выполнения торгового запроса
OnBookEvent | Вызывается в экспертах при наступлении события BookEvent для обработки изменений в стаканe заявок
OnChartEvent | Вызывается в индикаторах и экспертах при наступлении события ChartEvent для обработки изменений графика, вызванных действиями пользователя или работой MQL5-программ
OnTester | Вызывается в экспертах при наступлении события Tester для выполнения необходимых действий по окончании тестирования
OnTesterInit | Вызывается в экспертах при наступлении события TesterInit для выполнения необходимых действий перед началом оптимизации
OnTesterDeinit | Вызывается в экспертах при наступлении события TesterDeinit для выполнения необходимых действий по окончании оптимизации эксперта
OnTesterPass | Вызывается в экспертах при наступлении события TesterPass для обработки поступления нового фрейма данных во время оптимизации эксперта

Клиентский терминал отсылает возникающие события в соответствующие открытые графики. Также события могут генерироваться графиками (события графика) либо mql5-программами (пользовательские события). Генерацию событий создания и удаления графических объектов на графике можно включать и отключать заданием свойств графика CHART_EVENT_OBJECT_CREATE и CHART_EVENT_OBJECT_DELETE. Каждая mql5-программа и каждый график имеют свою собственную очередь событий, куда складываются все вновь поступающие события.

Программа получает события только от графика, на котором она запущена. Все события обрабатываются одно за другим в порядке поступления. Если в очереди уже есть событие NewTick либо это событие находится в состоянии обработки, то новое событие NewTick в очередь mql5-программы не ставится. Аналогично, если в очереди mql5-программы уже находится событие ChartEvent или такое событие обрабатывается, то новое событие такого типа не ставится в очередь. Обработка событий таймера производится по такой же схеме – если в очереди находится или уже обрабатывается событие Timer, то новое событие таймера не ставится в очередь.

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

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

Библиотеки не обрабатывают никаких событий.


Получение рыночной информации

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Получение рыночной информации

Получение рыночной информации

Функции для получения информации о состоянии рынка.

Функция | Действие
SymbolsTotal | Возвращает количество доступных (выбранных в MarketWatch или всех) символов
SymbolExist | Проверяет наличие символа с указанным именем
SymbolName | Возвращает наименование указанного символа
SymbolSelect | Выбирает символ в окне MarketWatch или убирает символ из окна
SymbolIsSynchronized | Проверяет синхронизированность данных по указанному символу в терминале с данными на торговом сервере
SymbolInfoDouble | Возвращает значение типа double указанного символа для соответствующего свойства
SymbolInfoInteger | Возвращает значение целочисленного типа (long, datetime, int или bool) указанного символа для соответствующего свойства
SymbolInfoString | Возвращает значение типа string указанного символа для соответствующего свойства
SymbolInfoMarginRate | Возвращает коэффициенты взимания маржи в зависимости от типа и направления ордера
SymbolInfoTick | Возвращает текущие цены для указанного символа в переменной типа MqlTick
SymbolInfoSessionQuote | Позволяет получить время начала и время окончания указанной котировочной сессии для указанных символа и дня недели.
SymbolInfoSessionTrade | Позволяет получить время начала и время окончания указанной торговой сессии для указанных символа и дня недели.
MarketBookAdd | Обеспечивает открытие стакана цен по указанному инструменту, а также производит подписку на получение извещений об изменении указанного стакана
MarketBookRelease | Обеспечивает закрытие стакана цен по указанному инструменту, а также отменяет подписку на получение извещений об изменении указанного стакана
MarketBookGet | Возвращает массив структур типа MqlBookInfo, содержащий записи стакана цен указанного символа


Экономический календарь

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Экономический календарь

Функциии Экономического Календаря

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

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

Функция | Действие
CalendarCountryById | Получает описание страны по её идентификатору
CalendarEventById | Получает описание события по его идентификатору
CalendarValueById | Получает описание значения события по его идентификатору
CalendarCountries | Получает массив описаний стран, доступных в Календаре
CalendarEventByCountry | Получает массив описаний всех событий, доступных в Календаре, по указанному коду страны
CalendarEventByCurrency | Получает массив описаний всех событий, доступных в Календаре, по указанной валюте
CalendarValueHistoryByEvent | Получает массив значений по всем событиям на заданном диапазоне времени по идентификатору события
CalendarValueHistory | Получает массив значений по всем событиям на заданном диапазоне времени с фильтром по стране и/или валюте
CalendarValueLastByEvent | Получает массив значений события по его ID c момента состояния базы Календаря с заданным change_id
CalendarValueLast | Получает массив значений по всем событиям с фильтрацией по стране и/или валюте с момента состояния базы Календаря с заданным change_id


Доступ к таймсериям и индикаторам

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Доступ к таймсериям и индикаторам

Доступ к таймсериям и данным индикаторов

Функции для работы с таймсериями и индикаторами. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым). Для копирования значений таймсерий и индикаторов рекомендуется использовать только динамические массивы, так как функции копирования самостоятельно распределяют необходимый размер массивов-приемников значений.

Функция | Действие
SeriesInfoInteger | Возвращает информацию о состоянии исторических данных
Bars | Возвращает количество баров в истории по соответствующим символу и периоду
BarsCalculated | Возвращает количество рассчитанных данных в индикаторном буфере или -1 в случае ошибки (данные еще не рассчитаны)
IndicatorCreate | Возвращает хэндл указанного технического индикатора, созданного на основе массива параметров типа MqlParam
IndicatorParameters | Возвращает по указанному хэндлу количество входных параметров индикатора, а также сами значения и тип параметров
IndicatorRelease | Удаляет хэндл индикатора и освобождает расчетную часть индикатора, если ею больше никто не пользуется
CopyBuffer | Получает в массив данные указанного буфера от указанного индикатора
CopyRates | Получает в массив исторические данные структуры Rates для указанных символа и периода
CopyTime | Получает в массив исторические данные по времени открытия баров по соответствующим символу и периоду
CopyOpen | Получает в массив исторические данные по цене открытия баров по соответствующим символу и периоду
CopyHigh | Получает в массив исторические данные по максимальной цене баров по соответствующим символу и периоду
CopyLow | Получает в массив исторические данные по минимальной цене баров по соответствующим символу и периоду
CopyClose | Получает в массив исторические данные по цене закрытия баров по соответствующим символу и периоду
CopyTickVolume | Получает в массив исторические данные по тиковым объемам для соответствующих символа и периода
CopyRealVolume | Получает в массив исторические данные по торговым объемам для соответствующих символа и периода
CopySpread | Получает в массив исторические данные по спредам для соответствующих символа и периода
CopyTicks | Получает в массив тики в формате MqlTick
CopyTicksRange | Получает в массив тики в указанном диапазоне дат
iBars | Возвращает количество баров в истории по соответствующему символу и периоду
iBarShift | Возвращает индекс бара, в который попадает указанное время
iClose | Возвращает значение цены закрытия бара (указанного параметром shift) соответствующего графика
iHigh | Возвращает значение максимальной цены бара (указанного параметром shift) соответствующего графика
iHighest | Возвращает индекс наибольшего найденного значения (смещение относительно текущего бара) соответствующего графика
iLow | Возвращает значение минимальной цены бара (указанного параметром shift) соответствующего графика
iLowest | Возвращает индекс наименьшего найденного значения (смещение относительно текущего бара) соответствующего графика
iOpen | Возвращает значение цены открытия бара (указанного параметром shift) соответствующего графика
iTime | Возвращает значение времени открытия бара (указанного параметром shift) соответствующего графика
iTickVolume | Возвращает значение тикового объема бара (указанного параметром shift) соответствующего графика
iRealVolume | Возвращает значение реального объема бара (указанного параметром shift) соответствующего графика
iVolume | Возвращает значение тикового объема бара (указанного параметром shift) соответствующего графика
iSpread | Возвращает значение спреда бара (указанного параметром shift) соответствующего графика


Пользовательские символы

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Пользовательские символы

Пользовательские символы

Функции для создания и редактирования свойств пользовательских символов.

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

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

Функция | Действие
CustomSymbolCreate | Создает пользовательский символ с указанным именем в указанной группе
CustomSymbolDelete | Удаляет пользовательский символ с указанным именем
CustomSymbolSetInteger | Устанавливает для пользовательского символа значение свойства целочисленного типа
CustomSymbolSetDouble | Устанавливает для пользовательского символа значение свойства вещественного типа
CustomSymbolSetString | Устанавливает для пользовательского символа значение свойства строкового типа
CustomSymbolSetMarginRate | Устанавливает для пользовательского символа коэффициенты взимания маржи в зависимости от типа и направления ордера
CustomSymbolSetSessionQuote | Устанавливает время начала и время окончания указанной котировочной сессии для указанных символа и дня недели
CustomSymbolSetSessionTrade | Устанавливает время начала и время окончания указанной торговой сессии для указанных символа и дня недели
CustomRatesDelete | Удаляет все бары в указанном временном интервале из ценовой истории пользовательского инструмента
CustomRatesReplace | Полностью заменяет ценовую историю пользовательского инструмента в указанном временном интервале данными из массива типа MqlRates
CustomRatesUpdate | Добавляет в историю пользовательского инструмента отсутствующие бары и заменяет существующие бары данными из массива типа MqlRates
CustomTicksAdd | Добавляет в ценовую историю пользовательского инструмента данные из массива типа MqlTick. Пользовательский символ должен быть выбран в окне MarketWatch (Обзор рынка)
CustomTicksDelete | Удаляет все тики в указанном временном интервале из ценовой истории пользовательского инструмента
CustomTicksReplace | Полностью заменяет ценовую историю пользовательского инструмента в указанном временном интервале данными из массива типа MqlTick
CustomBookAdd | Передает состояние стакана цен по пользовательскому инструменту


Операции с графиками

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Операции с графиками

Операции с графиками

Функции для установки свойств графика (ChartSetInteger, ChartSetDouble, ChartSetString) являются асинхронными и служат для отправки графику команд на изменение. При успешном выполнении этих функций команда попадает в общую очередь событий графика. Изменение свойств графика производится в процессе обработки очереди событий данного графика.

Функция | Действие
ChartApplyTemplate | Применяет к указанному графику шаблон из указанного файла
ChartSaveTemplate | Сохраняет текущие настройки графика в шаблон с указанным именем
ChartWindowFind | Возвращает номер подокна, в котором находится индикатор
ChartTimePriceToXY | Преобразует координаты графика из представления время/цена в координаты по оси X и Y
ChartXYToTimePrice | Преобразует координаты X и Y графика в значения время и цена
ChartOpen | Открывает новый график с указанным символом и периодом
ChartClose | Закрывает указанный график
ChartFirst | Возвращает идентификатор первого графика клиентского терминала
ChartNext | Возвращает идентификатор графика, следующего за указанным
ChartSymbol | Возвращает имя символа указанного графика
ChartPeriod | Возвращает значение периода указанного графика
ChartRedraw | Вызывает принудительную перерисовку указанного графика
ChartSetDouble | Задает значение типа double соответствующего свойства указанного графика
ChartSetInteger | Задает значение целочисленного типа (datetime, int, color, bool или char) соответствующего свойства указанного графика
ChartSetString | Задает значение типа string соответствующего свойства указанного графика
ChartGetDouble | Возвращает значение соответствующего свойства указанного графика
ChartGetInteger | Возвращает целочисленное значение соответствующего свойства указанного графика
ChartGetString | Возвращает строковое значение соответствующего свойства указанного графика
ChartNavigate | Осуществляет сдвиг указанного графика на указанное количество баров относительно указанной позиции графика
ChartID | Возвращает идентификатор текущего графика
ChartIndicatorAdd | Добавляет на указанное окно графика индикатор с указанным хэндлом.
ChartIndicatorDelete | Удаляет с указанного окна графика индикатор с указанным именем
ChartIndicatorGet | Возвращает хэндл индикатора с указанным коротким именем на указанном окне графика
ChartIndicatorName | Возвращает короткое имя индикатора по номеру в списке индикаторов на указанном окне графика.
ChartIndicatorsTotal | Возвращает количество всех индикаторов, присоединенных к указанному окну графика.
ChartWindowOnDropped | Возвращает номер подокна графика, на которое брошен мышкой данный эксперт, скрипт, объект или индикатор
ChartPriceOnDropped | Возвращает ценовую координату, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт
ChartTimeOnDropped | Возвращает временную координату, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт
ChartXOnDropped | Возвращает координату по оси X, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт
ChartYOnDropped | Возвращает координату по оси Y, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт
ChartSetSymbolPeriod | Меняет значения символа и периода указанного графика
ChartScreenShot | Делает снимок указанного графика в формате GIF, PNG или BMP в зависимости от указанного расширения


Торговые функции

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Торговые функции

Торговые функции

Торговые функции могут использоваться в экспертах и скриптах. Торговые функции могут быть вызваны только в том случае, если в свойствах соответствующего эксперта или скрипта включена галочка "Разрешить советнику торговать".

Разрешение или запрет на торговлю может зависеть от множества факторов, которые описаны в разделе "Разрешение на торговлю".

Функция | Действие
OrderCalcMargin | Вычисляет размер маржи, необходимой для указанного типа ордера, в валюте счета
OrderCalcProfit | Вычисляет размер прибыли на основании переданных параметров в валюте счета
OrderCheck | Проверяет достаточность средств для совершения требуемой торговой операции
OrderSend | Отправляет торговые запросы на сервер
OrderSendAsync | Отправляет асинхронно торговые запросы без ожидания ответа торгового сервера
PositionsTotal | Возвращает количество открытых позиций
PositionGetSymbol | Возвращает символ соответствующей открытой позиции
PositionSelect | Выбирает открытую позицию для дальнейшей работы с ней
PositionSelectByTicket | Выбирает открытую позицию для дальнейшей работы с ней по указанному тикету
PositionGetDouble | Возвращает запрошенное свойство открытой позиции (double)
PositionGetInteger | Возвращает запрошенное свойство открытой позиции (datetime или int)
PositionGetString | Возвращает запрошенное свойство открытой позиции (string)
PositionGetTicket | Возвращает тикет позиции по индексу в списке открытых позиций
OrdersTotal | Возвращает количество ордеров
OrderGetTicket | Возвращает тикет соответствующего ордера
OrderSelect | Выбирает ордер для дальнейшей работы с ним
OrderGetDouble | Возвращает запрошенное свойство ордера (double)
OrderGetInteger | Возвращает запрошенное свойство ордера (datetime или int)
OrderGetString | Возвращает запрошенное свойство ордера (string)
HistorySelect | Запрашивает историю сделок и ордеров за указанный период серверного времени
HistorySelectByPosition | Запрашивает историю сделок и ордеров c указанным идентификатором позиции
HistoryOrderSelect | Выбирает в истории ордер для дальнейшей работы с ним
HistoryOrdersTotal | Возвращает количество ордеров в истории
HistoryOrderGetTicket | Возвращает тикет соответствующего ордера в истории
HistoryOrderGetDouble | Возвращает запрошенное свойство ордера в истории (double)
HistoryOrderGetInteger | Возвращает запрошенное свойство ордера в истории (datetime или int)
HistoryOrderGetString | Возвращает запрошенное свойство ордера в истории (string)
HistoryDealSelect | Выбирает в истории сделку для дальнейших обращений к ней через соответствующие функции
HistoryDealsTotal | Возвращает количество сделок в истории
HistoryDealGetTicket | Выбирает сделку для дальнейшей обработки и возвращает тикет сделки в истории
HistoryDealGetDouble | Возвращает запрошенное свойство сделки в истории (double)
HistoryDealGetInteger | Возвращает запрошенное свойство сделки в истории (datetime или int)
HistoryDealGetString | Возвращает запрошенное свойство сделки в истории (string)


Управление сигналами

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Управление сигналами

Управление сигналами

Группа функций, предназначенных для управления торговыми сигналами. Данные функции позволяют:

  • получать информацию о торговых сигналах, доступных для копирования,
  • прочитать или установить настройки копирования торговых сигналов
  • произвести подписку на сигнал и ее отмену средствами языка MQL5.
Функция | Действие
SignalBaseGetDouble | Возвращает значение свойства типа double для выбранного сигнала
SignalBaseGetInteger | Возвращает значение свойства типа integer для выбранного сигнала
SignalBaseGetString | Возвращает значение свойства типа string для выбранного сигнала
SignalBaseSelect | Выбирает для работы сигнал из базы торговых сигналов, доступных в терминале
SignalBaseTotal | Возвращает общее количество сигналов, доступных в терминале
SignalInfoGetDouble | Возвращает из настроек копирования торгового сигнала значение свойства типа double
SignalInfoGetInteger | Возвращает из настроек копирования торгового сигнала значение свойства типа integer
SignalInfoGetString | Возвращает из настроек копирования торгового сигнала значение свойства типа string
SignalInfoSetDouble | Устанавливает в настройках копирования торгового сигнала значение свойства типа double
SignalInfoSetInteger | Устанавливает в настройках копирования торгового сигнала значение свойства типа integer
SignalSubscribe | Производит подписку на копирование торгового сигнала
SignalUnsubscribe | Отменяет подписку на копирование торгового сигнала


Сетевые функции

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Сетевые функции

Сетевые функции

Программы MQL5 могут обмениваться данными с удаленными серверами, отправлять push-уведомления, электронные письма и данные по FTP.

Чтобы уведомить пользователя о необходимости дополнительной настройки, добавьте в MQL5-программу явное сообщение. Например, через #property description, Alert или Print.

Функция | Действие
SocketCreate | Создает сокет с указанными флагами и возвращает его хэндл
SocketClose | Закрывает сокет
SocketConnect | Выполняет подключение к серверу с контролем таймаута
SocketIsConnected | Проверяет, подключен ли сокет в текущий момент времени
SocketIsReadable | Получает количество байт, которое можно прочитать из сокета
SocketIsWritable | Проверяет, возможна ли запись данных в сокет в текущий момент времени
SocketTimeouts | Устанавливает таймауты получения и отправки данных для системного объекта сокета
SocketRead | Читает данные из сокета
SocketSend | Записывает данные в сокете
SocketTlsHandshake | Инициирует защищенное TLS (SSL)-соединение с указанным хостом по протоколу TLS Handshake
SocketTlsCertificate | Получает данные о сертификате, используемом для защиты сетевого соединения
SocketTlsRead | Читает данные из защищенного TLS-соединения
SocketTlsReadAvailable | Читает все доступные данные из защищенного TLS-соединения
SocketTlsSend | Отправляет данные через защищенное TLS-соединение
WebRequest | Отправляет HTTP-запрос на указанный сервер
SendFTP | Посылает файл по адресу, указанному в окне настроек на закладке "FTP"
SendMail | Посылает электронное письмо по адресу, указанному в окне настроек на закладке "Почта"
SendNotification | Посылает Push-уведомления в мобильные терминалы, чьи MetaQuotes ID указаны на закладке "Уведомления"


Глобальные переменные терминала

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Глобальные переменные терминала

Глобальные переменные клиентского терминала

Группа функций, предназначенных для работы с глобальными переменными.

Глобальные переменные клиентского терминала доступны одновременно из всех mql5-программ, запущенных на клиентском терминале.

Функция | Действие
GlobalVariableCheck | Проверяет существование глобальной переменной с указанным именем
GlobalVariableTime | Возвращает время последнего доступа к глобальной переменной
GlobalVariableDel | Удаляет глобальную переменную
GlobalVariableGet | Запрашивает значение глобальной переменной
GlobalVariableName | Возвращает имя глобальной переменной по порядковому номеру в списке глобальных переменных
GlobalVariableSet | Устанавливает новое значение глобальной переменной
GlobalVariablesFlush | Принудительно записывает содержимое всех глобальных переменных на диск
GlobalVariableTemp | Устанавливает новое значение глобальной переменной, которая существует только на время текущего сеанса работы терминала
GlobalVariableSetOnCondition | Устанавливает новое значение существующей глобальной переменной по условию
GlobalVariablesDeleteAll | Удаляет глобальные переменные с указанным префиксом в имени
GlobalVariablesTotal | Возвращает общее количество глобальных переменных


Файловые операции

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Файловые операции

Файловые операции

Группа функций для работы с файлами. Файловые функции позволяют работать с так называемыми "именованными каналами". Для этого достаточно вызвать функцию FileOpen() с соответствующими параметрами.

Функция | Действие
FileFindFirst | Начинает перебор файлов в соответствующей директории в соответствии с указанным фильтром
FileFindNext | Продолжает поиск, начатый функцией FileFindFirst()
FileFindClose | Закрывает хэндл поиска
FileOpen | Открывает файл с указанным именем и указанными флагам
FileDelete | Удаляет указанный файл
FileFlush | Сброс на диск всех данных, оставшихся в файловом буфере ввода-вывода
FileGetInteger | Получает целочисленное свойство файла
FileIsEnding | Определяет конец файла в процессе чтения
FileIsLineEnding | Определяет конец строки в текстовом файле в процессе чтения
FileClose | Закрывает ранее открытый файл
FileIsExist | Проверяет существование файла
FileCopy | Копирует исходный файл из локальной или общей папки в другой файл
FileMove | Перемещает или переименовывает файл
FileReadArray | Читает массивы любых типов, кроме строковых (может быть массив структур, не содержащих строки и динамические массивы), из бинарного файла с текущего положения файлового указателя
FileReadBool | Читает из файла типа CSV строку от текущего положения до разделителя (либо до конца текстовой строки) и преобразует прочитанную строку в значение типа bool
FileReadDatetime | Читает из файла типа CSV строку одного из форматов: "YYYY.MM.DD HH:MM:SS", "YYYY.MM.DD" или "HH:MM:SS" - и преобразует ее в значение типа datetime
FileReadDouble | Читает число двойной точности с плавающей точкой (double) из бинарного файла с текущего положения файлового указателя
FileReadFloat | Читает из текущего положения файлового указателя значение типа float
FileReadInteger | Читает из бинарного файла значение типа int, short или char в зависимости от указанной длины в байтах
FileReadLong | Читает из текущего положения файлового указателя значение типа long
FileReadNumber | Читает из файла типа CSV строку от текущего положения до разделителя (либо до конца текстовой строки) и преобразует прочитанную строку в значение типа double
FileReadString | Читает из файла строку с текущего положения файлового указателя
FileReadStruct | Cчитывает из бинарного файла содержимое в структуру, переданную в качестве параметра
FileSeek | Перемещает положение файлового указателя на указанное количество байт относительно указанного положения
FileSize | Возвращает размер соответствующего открытого файла
FileTell | Возвращает текущее положение файлового указателя соответствующего открытого файла
FileWrite | Записывает данные в файл типа CSV или TXT
FileWriteArray | Записывает в файл типа BIN массивы любых типов, кроме строковых
FileWriteDouble | Записывает в бинарный файл значение параметра типа double с текущего положения файлового указателя
FileWriteFloat | Записывает в бинарный файл значение параметра типа float с текущего положения файлового указателя
FileWriteInteger | Записывает в бинарный файл значение параметра типа int с текущего положения файлового указателя
FileWriteLong | Записывает в бинарный файл значение параметра типа long с текущего положения файлового указателя
FileWriteString | Записывает в файл типа BIN или TXT значение параметра типа string с текущего положения файлового указателя
FileWriteStruct | Записывает в бинарный файл содержимое структуры, переданной в качестве параметра, с текущего положения файлового указателя
FileLoad | Считывает всё содержимое указанного бинарного файла в переданный массив числовых типов или простых структур
FileSave | Записывает в бинарный файл все элементы массива, переданного в качестве параметра
FolderCreate | Создает директорию в папке Files (в зависимости от значения common_flag)
FolderDelete | Удаляет указанную директорию. Если папка не пуста, то она не может быть удалена
FolderClean | Удаляет все файлы в указанной папке

Если файл открывается для записи с помощью функции FileOpen(), то все указанные в пути подпапки будут созданы в случае их отсутствия.


Пользовательские индикаторы

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Пользовательские индикаторы

Пользовательские индикаторы

Группа функций, используемых при оформлении пользовательских индикаторов. Данные функции нельзя использовать при написании советников и скриптов.

Функция | Действие
SetIndexBuffer | Связывает указанный индикаторный буфер с одномерным динамическим массивом типа double
IndicatorSetDouble | Задает значение свойства индикатора, имеющего тип double
IndicatorSetInteger | Задает значение свойства индикатора,имеющего тип int
IndicatorSetString | Задает значение свойства индикатора, имеющего тип string
PlotIndexSetDouble | Задает значение свойства линии индикатора, имеющего тип double
PlotIndexSetInteger | Задает значение свойства линии индикатора, имеющего тип int
PlotIndexSetString | Задает значение свойства линии индикатора, имеющего тип string
PlotIndexGetInteger | Возвращает значение свойства линии индикатора, имеющего целый тип

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


Графические объекты

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Графические объекты

Графические объекты

Группа функций, предназначенных для работы с графическими объектами, относящимися к любому указанному графику.

Функции, задающие свойства графических объектов, а также операции создания ObjectCreate() и перемещения ObjectMove() объектов на графике фактически служат для отправки команд графику. При успешном выполнении этих функций команда попадает в общую очередь событий графика. Визуальное изменение свойств графических объектов производится в процессе обработки очереди событий данного графика.

Функция | Действие
ObjectCreate | Создает объект заданного типа на указанном графике
ObjectName | Возвращает имя объекта соответствующего типа в указанном графике (указанном подокне графика)
ObjectDelete | Удаляет объект с указанным именем с указанного графика (с указанного подокна графика)
ObjectsDeleteAll | Удаляет все объекты указанного типа с указанного графика (с указанного подокна графика)
ObjectFind | Ищет по имени объект с указанным идентификатором
ObjectGetTimeByValue | Возвращает значение времени для указанного значения цены объекта
ObjectGetValueByTime | Возвращает ценовое значение объекта для указанного времени
ObjectMove | Изменяет координаты указанной точки привязки объекта
ObjectsTotal | Возвращает количество объектов указанного типа в указанном графике (указанном подокне графика)
ObjectGetDouble | Возвращает значение типа double соответствующего свойства объекта
ObjectGetInteger | Возвращает целочисленное значение соответствующего свойства объекта
ObjectGetString | Возвращает значение типа string соответствующего свойства объекта
ObjectSetDouble | Устанавливает значение соответствующего свойства объекта
ObjectSetInteger | Устанавливает значение соответствующего свойства объекта
ObjectSetString | Устанавливает значение соответствующего свойства объекта
TextSetFont | Устанавливает шрифт для вывода текста методами рисования (по умолчанию используется шрифт Arial 20)
TextOut | Выводит текст в пользовательский массив (буфер), предназначенный для создания графического ресурса
TextGetSize | Возвращает ширину и высоту строки при текущих настройках шрифта

Каждый графический объект должен иметь имя, уникальное в пределах одного графика, включая его подокна. Изменение имени графического объекта формирует два события: первое - это событие удаления объекта со старым именем, и второе – событие создания графического объекта с новым именем.

После создания объекта или модификации свойств объекта рекомендуется вызывать функцию ChartRedraw(), которая отдает терминалу команду на принудительную отрисовку графика (и всех видимых на нем объектов).


Технические индикаторы

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Технические индикаторы

Функции для работы с техническими индикаторами

Все функции типа iMA, iAC, iMACD, iIchimoku и т.п., создают в глобальном кеше клиентского терминала копию соответствующего технического индикатора. Если копия индикатора с этими параметрами уже существует, то новая копия не создается, а увеличивается счетчик ссылок на данную копию.

Эти функции возвращают хэндл соответствующей копии индикатора. Используя этот хэндл в дальнейшем можно получать данные, рассчитанные соответствующим индикатором. Данные соответствующего буфера (технические индикаторы содержат рассчитанные данные в своих внутренних буферах, которых, в зависимости от индикатора, может быть от 1 до 5) можно копировать в mql5-программу при помощи функции CopyBuffer().

Все индикаторные функции имеют как минимум 2 параметра - символ и период. Значение символа NULL означает текущий инструмент, значение периода 0 означает текущий таймфрейм.

Функция | Возвращает хэндл индикатора:
iAC | Accelerator Oscillator
iAD | Accumulation/Distribution
iADX | Average Directional Index
iADXWilder | Average Directional Index by Welles Wilder
iAlligator | Alligator
iAMA | Adaptive Moving Average
iAO | Awesome Oscillator
iATR | Average True Range
iBearsPower | Bears Power
iBands | Bollinger Bands®
iBullsPower | Bulls Power
iCCI | Commodity Channel Index
iChaikin | Chaikin Oscillator
iCustom | пользовательский индикатор
iDEMA | Double Exponential Moving Average
iDeMarker | DeMarker
iEnvelopes | Envelopes
iForce | Force Index
iFractals | Fractals
iFrAMA | Fractal Adaptive Moving Average
iGator | Gator Oscillator
iIchimoku | Ichimoku Kinko Hyo
iBWMFI | Market Facilitation Index by Bill Williams
iMomentum | Momentum
iMFI | Money Flow Index
iMA | Moving Average
iOsMA | Moving Average of Oscillator (MACD histogram)
iMACD | Moving Averages Convergence-Divergence
iOBV | On Balance Volume
iSAR | Parabolic Stop And Reverse System
iRSI | Relative Strength Index
iRVI | Relative Vigor Index
iStdDev | Standard Deviation
iStochastic | Stochastic Oscillator
iTEMA | Triple Exponential Moving Average
iTriX | Triple Exponential Moving Averages Oscillator
iWPR | Williams' Percent Range
iVIDyA | Variable Index Dynamic Average
iVolumes | Volumes


Работа с результатами оптимизации

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Работа с результатами оптимизации

Работа с результатами оптимизации

Функции для организации собственной обработки результатов оптимизации в тестере стратегий. Могут вызываться при оптимизации в агентах тестирования, а также локально в экспертах и скриптах.

При запуске эксперта в тестере стратегий можно создать собственный массив данных на основе простых типов или простых структур (не содержат строки, объекты класса или объекты динамических массивов). Этот набор данных можно сохранить с помощью функции FrameAdd() в специальной структуре, называемой фрейм (кадр). Каждый агент при оптимизации эксперта может посылать в терминал серию фреймов. Все полученные фреймы в порядке поступления от агентов записываются в *.MQD-файл по имени эксперта в папку каталог_терминала\MQL5\Files\Tester. Поступление фрейма в клиентский терминал от агента тестирования генерирует событие TesterPass.

Фреймы можно сохранять как в память компьютера, так и в файл с указанным именем. Нет никаких ограничений на количество фреймов со стороны языка MQL5.

Функция | Действие
FrameFirst | Переводит указатель чтения фреймов в начало и сбрасывает ранее установленный фильтр
FrameFilter | Устанавливает фильтр чтения фреймов и переводит указатель на начало
FrameNext | Читает фрейм и перемещает указатель на следующий
FrameInputs | Получает input-параметры, на которых сформирован фрейм
FrameAdd | Добавляет фрейм с данными
ParameterGetRange | Получает для input-переменной информацию о диапазоне значений и шаге изменения при оптимизации эксперта в тестере стратегий
ParameterSetRange | Устанавливает правила использования input-переменной при оптимизации эксперта в тестере стратегий: значение, шаг изменения, начальное и конечное значения


Работа с событиями

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Работа с событиями

Работа с событиями

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

Функция | Действие
EventSetMillisecondTimer | Запускает генератор событий таймера высокого разрешения с периодом менее 1 секунды для текущего графика
EventSetTimer | Запускает генератор событий таймера с указанной периодичностью для текущего графика
EventKillTimer | Останавливает на текущем графике генерацию событий по таймеру
EventChartCustom | Генерирует пользовательское событие для указанного графика


Работа с OpenCL

Справочник MQL4 / Возможности MQL5 / Функции MQL5 / Работа с OpenCL

Работа с OpenCL

Программы на OpenCL предназначены для выполнения вычислений на видеокартах с поддержкой стандарта OpenCL 1.1 или выше. Современные видеокарты содержат сотни небольших специализированных процессоров, которые могут одновременно выполнять простые математические операции над входящими потоками данных. Язык OpenCL берёт на себя организацию таких параллельных вычислений и позволяет добиться огромного ускорения для некоторого класса задач.

Исходный код OpenCL рекомендуется писать в отдельных CL-файлах, которые затем можно подключать к MQL5-программе с помощью ресурсных переменных.

Функция | Действие
CLHandleType | Возвращает тип OpenCL хендла в виде значения из перечисления ENUM_OPENCL_HANDLE_TYPE
CLGetInfoInteger | Возвращает значение целочисленного свойства для OpenCL-объекта или устройства
CLGetInfoString | Возвращает строковое значение свойства для OpenCL-объекта или устройства
CLContextCreate | Cоздает контекст OpenCL
CLContextFree | Удаляет контекст OpenCL
CLGetDeviceInfo | Получает свойство устройства из OpenCL драйвера
CLProgramCreate | Создает OpenCL программу из исходного кода
CLProgramFree | Удаляет OpenCL программу
CLKernelCreate | Создает функцию запуска OpenCL
CLKernelFree | Удаляет функцию запуска OpenCL
CLSetKernelArg | Выставляет параметр для функции OpenCL
CLSetKernelArgMem | Выставляет буфер OpenCL в качестве параметра функции OpenCL
CLSetKernelArgMemLocal | Задаёт локальный буфер в качестве аргумента kernel-функции
CLBufferCreate | Создает буфер OpenCL
CLBufferFree | Удаляет буфер OpenCL
CLBufferWrite | Записывает массив в буфер OpenCL и возвращает количество записанных элементов
CLBufferRead | Читает буфер OpenCL в массив и возвращает количество прочитанных элементов
CLExecute | Выполняет OpenCL программу
CLExecutionStatus | Возвращает состояние выполнения OpenCL программы


Основы языка

Справочник MQL4 / Основы языка

Основы языка

Язык MetaQuotes Language 4 (MQL4) является объектно-ориентированным языком программирования высокого уровня и предназначен для написания автоматических торговых стратегий, пользовательских технических индикаторов для анализа разнообразных финансовых рынков. Он позволяет не только писать разнообразные экспертные системы, предназначенные для работы в режиме реального времени, но и создавать собственные графические инструменты, помогающие принимать торговые решения.

MQL4 основан на концепции широко распространенного языка программирования С++, в нем присутствуют перечисления, структуры, классы и обработка событий. Благодаря расширению числа встроенных основных типов, взаимодействие исполняемых программ на MQL4 с другими приложениями посредством dll максимально облегчено. Синтаксис языка MQL4 подобен синтаксису С++, и это позволяет легко переносить на него программы из современных языков программирования.

Для целей изучения языка MQL4 все темы сгруппированы по следующим разделам:

  • Синтаксис
  • Типы данных
  • Операции и выражения
  • Операторы
  • Функции
  • Переменные
  • Препроцессор
  • Объектно-ориентированное программирование
  • Обновленный MQL4


Синтаксис

Справочник MQL4 / Основы языка / Синтаксис

Синтаксис

Синтаксически язык программирования торговых стратегий MQL4 очень похож на язык программирования С++, за исключением некоторых возможностей:

  • отсутствует адресная арифметика;
  • отсутствует оператор goto;
  • нельзя объявить анонимное перечисление;
  • нет множественного наследования.

Смотри также

Перечисления, Структуры и классы, Наследование


Комментарии

Справочник MQL4 / Основы языка / Синтаксис / Комментарии

Комментарии

Многострочные комментарии начинаются парой символов /* и заканчиваются парой */. Данные комментарии не могут быть вложенными. Однострочные комментарии начинаются парой символов //, заканчиваются символом новой строки и могут быть вложены в многострочные комментарии. Комментарии разрешены везде, где возможны пробелы, и допускают любое число пробелов.

Примеры:

//--- Однострочный комментарий
/* Многостроч-
ный // Вложенный однострочный комментарий
комментарий
*/


Идентификаторы

Справочник MQL4 / Основы языка / Синтаксис / Идентификаторы

Идентификаторы

Идентификаторы используются в качестве имен для переменных и функций. Длина идентификатора не может превышать 63 знака.

Допустимые символы при написании идентификатора: цифры 0-9, латинские прописные и строчные буквы а-z и А-Z, распознаваемые как разные символы, символ подчеркивания (_). Первый символ не может быть цифрой.

Идентификатор не должен совпадать с зарезервированным словом.

Примеры:

NAME1 namel Total_5 Paper

Смотри также

Переменные, Функции


Зарезервированные слова

Справочник MQL4 / Основы языка / Синтаксис / Зарезервированные слова

Зарезервированные слова

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

Типы данных

bool | enum | struct
char | float | uchar
class | int | uint
color | long | ulong
datetime | short | ushort
double | string | void

Спецификаторы доступа

const | private | protected
public | virtual |

Классы памяти

extern

input

static

Операторы

break | dynamic_cast | return
case | else | sizeof
continue | for | switch
default | if | while
delete | new |
do | operator |

Прочие

false | #define | #property
this | #import | template
true | #include | typename
strict |  |


Типы данных

Справочник MQL4 / Основы языка / Типы данных

Типы данных

Любая программа оперирует данными. Данные могут быть различных типов в зависимости от назначения. Например, для доступа к элементам массива используются данные целочисленного типа. Ценовые данные имеют тип двойной точности с плавающей точкой. Это связано с тем, что в языке MQL4 не предусмотрено специального типа для ценовых данных.

Данные разного типа обрабатываются с разной скоростью. Целочисленные данные обрабатываются быстрее всего. Для обработки данных двойной точности используется специальный сопроцессор. Однако из-за сложности внутреннего представления данных с плавающей точкой, они обрабатывается дольше, чем целочисленные.

Дольше всего обрабатываются строковые данные. Это связано с динамическим распределением-перераспределением оперативной памяти компьютера.

Основные типы данных:

  • целые (char, short, int, long, uchar, ushort, uint, ulong)
  • логические (bool)
  • литералы (ushort)
  • строки (string)
  • с плавающей точкой (double, float)
  • цвет (color)
  • дата и время (datetime)
  • перечисления (enum)

Сложные типы данных:

  • структуры;
  • классы.

В терминах OOП сложные типы данных называются абстрактными типами данных.

Типы color и datetime имеют смысл только для удобства представления и ввода параметров, задаваемых извне - из таблицы свойств советника или пользовательского индикатора (вкладка "Inputs"). Данные типов color и datetime представляются в виде целых чисел. Целые типы вместе с типами с плавающей точкой называются арифметическими (числовыми) типами.

В выражениях используется неявное приведение типов, если не указано явное приведение.

Смотри также

Приведение типов


Целые константы

Справочник MQL4 / Основы языка / Типы данных / Целые типы

Целые типы

Целые типы представлены в языке MQL4 одиннадцатью видами. Некоторые из типов могут использоваться вместе с другими, если этого требует логика программы, но при этом необходимо иметь ввиду правила преобразования типов.

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

Тип | Размер в байтах | Минимальное значение | Максимальное значение | Аналог в языке С++
char | 1 | -128 | 127 | char
uchar | 1 | 0 | 255 | unsigned char, BYTE
bool | 1 | 0(false) | 1(true) | bool
short | 2 | -32 768 | 32 767 | short, wchar_t
ushort | 2 | 0 | 65 535 | unsigned short, WORD
int | 4 | - 2 147 483 648 | 2 147 483 647 | int
uint | 4 | 0 | 4 294 967 295 | unsigned int, DWORD
color | 4 | -1 | 16 777 215 | int, COLORREF
long | 8 | -9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 | __int64
ulong | 8 | 0 | 18 446 744 073 709 551 615 | unsigned __int64
datetime | 8 | 0 (1970.01.01 0:00:00) | 32 535 244 799 (3000.12.31 23:59:59) | __time64_t

Значения целых типов можно также представлять в виде числовых констант, цветовых литералов, литералов даты-времени, символьных констант и перечислений.

Смотри также

Преобразование данных, Константы числовых типов


Типы char, short, int и long

Справочник MQL4 / Основы языка / Типы данных / Целые типы / Типы char, short, int и long

Типы char, short, int и long

char

Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127.

uchar

Целый тип uchar также занимает в памяти 1 байт, как и тип char, но в отличие от него, uchar предназначен только для положительных значений. Минимальное значение равно нулю, максимальное значение равно 255. Первая буква u в названии типа uchar является сокращением слова unsigned (беззнаковый).

short

Целый тип short имеет размер 2 байта(16 бит) и, соответственно, позволяет выразить множество значений равное 2 в степени 16: 2^16=65 536. Так как тип short является знаковым и содержит как положительные, так и отрицательные значения, то диапазон значений находится между -32 768 и 32 767.

ushort

Беззнаковым типом short является тип ushort, который также имеет размер 2 байта. Минимальное значение равно 0, максимальное значение 65 535.

int

Целый тип int имеет размер 4 байта (32 бита). Минимальное значение -2 147 483 648, максимальное значение 2 147 483 647.

uint

Беззнаковый целый тип uint занимает в памяти 4 байта и позволяет выражать целочисленные значения от 0 до 4 294 967 295.

long

Целый тип long имеет размер 8 байт (64 бита). Минимальное значение -9 223 372 036 854 775 808, максимальное значение 9 223 372 036 854 775 807.

ulong

Целый тип ulong также занимает 8 байт и позволяет хранить значения от 0 до 18 446 744 073 709 551 615.

Примеры:

char ch=12;
short sh=-5000;
int in=2445777;

Так как беззнаковые целые типы не предназначены для хранения отрицательных значений, то попытка установить отрицательное значение может привести к неожиданным последствиям. Вот такой невинный скрипт приведет к бесконечному циклу:

//--- бесконечный цикл
void OnStart()
{
uchar u_ch;

for(char ch=-128;ch<128;ch++)
{
u_ch=ch;
Print("ch = ",ch," u_ch = ",u_ch);
}
}

Правильно будет так:

//--- правильный вариант
void OnStart()
{
uchar u_ch;

for(char ch=-128;ch<=127;ch++)
{
u_ch=ch;
Print("ch = ",ch," u_ch = ",u_ch);
if(ch==127) break;
}
}

Результат:

ch= -128 u_ch= 128
ch= -127 u_ch= 129
ch= -126 u_ch= 130
ch= -125 u_ch= 131
ch= -124 u_ch= 132
ch= -123 u_ch= 133
ch= -122 u_ch= 134
ch= -121 u_ch= 135
ch= -120 u_ch= 136
ch= -119 u_ch= 137
ch= -118 u_ch= 138
ch= -117 u_ch= 139
ch= -116 u_ch= 140
ch= -115 u_ch= 141
ch= -114 u_ch= 142
ch= -113 u_ch= 143
ch= -112 u_ch= 144
ch= -111 u_ch= 145
...

Примеры:

//--- отрицательные значения нельзя хранить в беззнаковых типах
uchar u_ch=-120;
ushort u_sh=-5000;
uint u_in=-401280;

Шестнадцатеричные: цифры 0-9, буквы а-f или А-F для значений 10-15; начинаются с 0х или 0Х.

Примеры:

0x0A, 0x12, 0X12, 0x2f, 0xA3, 0Xa3, 0X7C7

Смотри также

Приведение типов


Символьные константы

Справочник MQL4 / Основы языка / Типы данных / Целые типы / Символьные константы

Символьные константы

Символы, как элемент строки, в MQL4 - это индексы в наборе символов Unicode. Они являются 16-разрядными значениями, которые можно преобразовывать в целые числа и с которыми можно манипулировать целочисленными операциями, такими как сложение и вычитание.

Любой одиночный символ, заключенный в одинарные кавычки, или шестнадцатеричный ASCII-код символа в виде '\x10' является символьной константой и имеет тип ushort. Например, запись вида '0' представляет из себя числовое значение 30, соответствующее индексу, по которому в таблице символов располагается символ ноль.

Пример:

void OnStart()
{
//--- определим символьные константы
int symbol_0='0';
int symbol_9=symbol_0+9; // получим символ '9'
//--- выведем значения констант
printf("В десятичном виде: symbol_0 = %d, symbol_9 = %d",symbol_0,symbol_9);
printf("В шестнадцетеричном виде: symbol_0 = 0x%x, symbol_9 = 0x%x",symbol_0,symbol_9);
//--- заведем константы в строку
string test="";
StringSetCharacter(test,0,symbol_0);
StringSetCharacter(test,1,symbol_9);
//--- а вот как они выглядят в строке
Print(test);
}

Обратная косая черта является управляющим символом для компилятора при разборе константных строк и символьных констант в исходном тексте программы. Некоторые символы, например, одинарные кавычки ('), двойные кавычки ("), обратная косая черта (\) и управляющие символы можно представлять комбинацией символов, начинающейся с обратной косой черты(\), в соответствии с приводимой ниже таблицей:

Название символа | Мнемокод или изображение | Запись в MQL4 | Числовое значение
новая строка (перевод строки) | LF | '\n' | 10
горизонтальная табуляция | HT | '\t' | 9
возврат каретки | CR | '\r' | 13
обратная косая черта | \ | '\\' | 92
одинарная кавычка | ' | '\'' | 39
двойная кавычка | " | '\"' | 34
шестнадцатеричный код | hhhh | '\xhhhh' | от 1до 4 шестнадцатеричных знаков
десятичный код | d | '\d' | десятичное число от 0 до 65535

Если за обратной косой чертой следует символ, отличный от перечисленных, результат не определен.

Пример

void OnStart()
{
//--- объявим символьные константы
int a='A';
int b='$';
int c='©'; // код 0xA9
int d='\xAE'; // код символа ®
//--- выведем константы на печать
Print(a,b,c,d);
//--- добавим символ в строку
string test="";
StringSetCharacter(test,0,a);
Print(test);
//--- заменим символ в строке
StringSetCharacter(test,0,b);
Print(test);
//--- заменим символ в строке
StringSetCharacter(test,0,c);
Print(test);
//--- заменим символ в строке
StringSetCharacter(test,0,d);
Print(test);
//--- представим символы в виде числа
int a1=65;
int b1=36;
int c1=169;
int d1=174;
//--- добавим символ в строку
StringSetCharacter(test,1,a1);
Print(test);
//--- заменим символ в строке
StringSetCharacter(test,1,b1);
Print(test);
//--- заменим символ в строке
StringSetCharacter(test,1,c1);
Print(test);
//--- заменим символ в строке
StringSetCharacter(test,1,d1);
Print(test);
}

Как уже говорилось выше, значение символьной константы (или переменной) представляет собой индекс в таблице символов, а так как индекс является целым числом, то допустимо его записывать разными способами.

void OnStart()
{
//---
int a=0xAE; // код символа ® соответствует литералу '\xAE'
int b=0x24; // код символа $ соответствует литералу '\x24'
int c=0xA9; // код символа © соответствует литералу '\xA9'
int d=0x263A; // код символа ☺ соответствует литералу '\x263A'
//--- выведем значения
Print(a,b,c,d);
//--- добавим символ в строку
string test="";
StringSetCharacter(test,0,a);
Print(test);
//--- заменим символ в строке
StringSetCharacter(test,0,b);
Print(test);
//--- заменим символ в строке
StringSetCharacter(test,0,c);
Print(test);
//--- заменим символ в строке
StringSetCharacter(test,0,d);
Print(test);
//--- коды мастей
int a1=0x2660;
int b1=0x2661;
int c1=0x2662;
int d1=0x2663;
//--- добавим символ пикей
StringSetCharacter(test,1,a1);
Print(test);
//--- добавим символ червей
StringSetCharacter(test,2,b1);
Print(test);
//--- добавим символ бубей
StringSetCharacter(test,3,c1);
Print(test);
//--- добавим символ треф
StringSetCharacter(test,4,d1);
Print(test);
//--- Пример символьных литералов в строке
test="Дама\x2660Туз\x2662";
printf("%s",test);
}

Внутреннее представление символьного литерала - тип ushort. Символьные константы могут принимать значения от 0 до 65535.

Смотри также

StringSetCharacter(), StringGetCharacter(), ShortToString(), ShortArrayToString(), StringToShortArray()


Тип datetime

Справочник MQL4 / Основы языка / Типы данных / Целые типы / Тип datetime

Тип datetime

Тип datetime предназначен для хранения даты и времени в виде количества секунд, прошедших с 01 января 1970 года. Занимает в памяти 8 байт.

Константы даты и времени могут быть представлены в виде литеральной строки, которая состоит из 6 частей, представляющих числовое значение года, месяца, числа (либо числа, месяца, года), часа, минуты и секунды. Константа обрамляется одинарными кавычками и начинается с символа D.

Диапазон значений от 1 января 1970 года до 31 декабря 3000 года. Может опускаться либо дата (год, месяц, число), либо время (часы, минуты, секунды), либо все вместе.

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

Примеры:

datetime NY=D'2015.01.01 00:00'; // время наступления 2015 года
datetime d1=D'1980.07.19 12:30:27'; // год месяц день часы минуты секунды
datetime d2=D'19.07.1980 12:30:27'; // равнозначно D'1980.07.19 12:30:27';
datetime d3=D'19.07.1980 12'; // равнозначно D'1980.07.19 12:00:00'
datetime d4=D'01.01.2004'; // равнозначно D'01.01.2004 00:00:00'
datetime compilation_date=__DATE__; // дата компиляции
datetime compilation_date_time=__DATETIME__; // дата и время компиляции
datetime compilation_time=__DATETIME__-__DATE__;// время компиляции
//--- примеры объявлений, на которые будут получены предупреждения компилятора
datetime warning1=D'12:30:27'; // равнозначно D'[дата компиляции] 12:30:27'
datetime warning2=D''; // равнозначно __DATETIME__

Следует иметь ввиду, что преобразование типа datetime в строку зависит от режима компиляции:

datetime date=D'2014.03.05 15:46:58';
string str="mydate="+date;
//--- str="mydate=1394034418" - результат без директивы #property strict
//--- str="mydate=2014.03.05 15:46:58" - результат с директивой #property strict

Смотри также

Структура даты, Дата и время, TimeToString, StringToTime


Тип color

Справочник MQL4 / Основы языка / Типы данных / Целые типы / Тип color

Тип color

Тип color предназначен для хранения информации о цвете и занимает в памяти 4 байта. Первый байт не учитывается, остальные 3 байта содержат RGB-составляющие.

Цветовые константы могут быть представлены тремя различными способами: литерально, целочисленно или при помощи имени (только для именованных Web-цветов).

Литеральное представление состоит из трех частей, представляющих числовые значения интенсивности трех основных компонент цвета: красной (red), зеленой (green), синей (blue). Константа начинается с символа C и обрамляется одинарными кавычками. Числовые значения интенсивности компоненты цвета лежат в диапазоне от 0 до 255.

Целочисленное представление записывается в виде шестнадцатеричного или десятичного числа. Шестнадцатеричное число имеет вид 0x00BBGGRR, где RR - значение интенсивности красной компоненты цвета, GG - зеленной, а BB - синей. Десятичные константы не имеют прямого отражения в RGB. Они представляют собой десятичное значение шестнадцатеричного целочисленного представления.

Именованные цвета отражают так называемый набор Web-цветов.

Примеры:

//--- литералы
C'128,128,128' // серый
C'0x00,0x00,0xFF' // синий
//названия цветов
clrRed // красный
clrYellow // желтый
clrBlack // черный
//--- целочисленные представления
0xFFFFFF // белый
16777215 // белый
0x008000 // зеленый
32768 // зеленый

Смотри также

Набор Web-цветов, ColorToString, StringToColor, Приведение типов


Тип bool

Справочник MQL4 / Основы языка / Типы данных / Целые типы / Тип bool

Тип bool

Тип bool предназначен для хранения логических значений true (истина) или false (ложь), числовое представление которых 1 или 0 соответственно.

Примеры:

bool a = true;
bool b = false;
bool c = 1;

Внутреннее представление – целое число размером 1 байт. Необходимо отметить, что в логических выражениях допустимо использовать вместо типа bool другие целые или вещественные типы или выражения этих типов, компилятор не выдаст ошибки. В таком случае значение ноль будет интерпретировано как false, а все остальные значения как true.

Примеры:

int i=5;
double d=-2.5;
if(i) Print("i = ",i," и имеет значение true");
else Print("i = ",i," и имеет значение false");

if(d) Print("d = ",d," и имеет значение true");
else Print("d = ",d," и имеет значение false");

i=0;
if(i) Print("i = ",i," и имеет значение true");
else Print("i = ",i," и имеет значение false");

d=0.0;
if(d) Print("d = ",d," и имеет значение true");
else Print("d = ",d," и имеет значение false");

//--- результаты выполнения
// i= 5 и имеет значение true
// d= -2.5 и имеет значение true
// i= 0 и имеет значение false
// d= 0 и имеет значение false

Смотри также

Логические операции, Приоритеты и порядок операций


Перечисления

Справочник MQL4 / Основы языка / Типы данных / Целые типы / Перечисления

Перечисления

Данные перечислимого типа enum относятся к некоторому ограниченному множеству данных. Определение перечислимого типа:

enum имя_перечислимого_типа
{
список_значений
};

Список значений представляет из себя список идентификаторов именованных констант, разделенных запятыми.

Пример:

enum months // перечисление именованных констант
{
January,
February,
March,
April,
May,
June,
July,
August,
September,
October,
November,
December
};

После объявления перечисления появляется новый целочисленный 4-байтовый тип данных. Объявление нового типа данных позволяет компилятору строго контролировать типы передаваемых параметров, так как перечисление вводит новые именованные константы. В приведенном примере именованная константа January имеет значение 0, February имеет значение 1, December имеет значение 11.

Правило: если именованной константе - члену перечисления явно не присвоено конкретное значение, то ее значение будет сформировано автоматически. Если это первый член перечисления, то будет присвоено значение 0. Для всех последующих членов значения будет вычисляться на основе значения предыдущего члена путем прибавления единицы.

Пример:

enum intervals // перечисление именованных констант
{
month=1, // интервал в один месяц
two_months, // два месяца
quarter, // три месяца - квартал
halfyear=6, // полугодие
year=12, // год - 12 месяцев
};

Примечания

  • В отличие от C++, размер внутреннего представления перечислимого типа в MQL4 всегда составляет 4 байта. То есть, sizeof(months) вернет значение 4.
  • В отличие от C++, в MQL4 нельзя объявить анонимное перечисление. То есть, после ключевого слова enum всегда должно быть указано уникальное имя.

Смотри также

Приведение типов


Вещественные типы (double, float)

Справочник MQL4 / Основы языка / Типы данных / Вещественные типы (double, float)

Вещественные типы (double, float)

Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL4 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования.

Тип | Размер в байтах | Минимальное положительное значение | Максимальное значение | Аналог в С++
float | 4 | 1.175494351e-38 | 3.402823466e+38 | float
double | 8 | 2.2250738585072014e-308 | 1.7976931348623158e+308 | double

Имя double означает, что точность этих чисел вдвое превышает точность чисел типа float. В большинстве случаев тип double является наиболее удобным. Ограниченной точности чисел float во многих случаях попросту недостаточно. Причина, по которой тип float все еще используется, - экономия памяти при хранении (это важно для больших массивов вещественных чисел).

Константы с плавающей точкой состоят из целой части, точки (.) и дробной части. Целая и дробная части представляют собой последовательности десятичных цифр.

Примеры:

double a=12.111;
double b=-956.1007;
float c =0.0001;
float d =16;

Существует научный способ записи вещественных констант, зачастую этот способ записи более компактный, чем традиционный.

Пример:

double c1=1.12123515e-25;
double c2=0.000000000000000000000000112123515; // 24 нуля после десятичной точки

Print("1. c1 = ",DoubleToString(c1,16));
// Результат: 1. c1 = 0.0000000000000000

Print("2. c1 = ",DoubleToString(c1,-16));
// Результат: 2. c1 = 1.1212351499999999e-025

Print("3. c2 = ",DoubleToString(c2,-16));
// Результат: 3. c2 = 1.1212351499999999e-025

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

Например, числа 0.3 и 0.7 представлены в компьютере бесконечными дробями, в то время как число 0.25 хранится точно, так как представляет из себя степень двойки.

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

Пример:

void OnStart()
{
//---
double three=3.0;
double x,y,z;
x=1/three;
y=4/three;
z=5/three;
if(x+y==z) Print("1/3 + 4/3 == 5/3");
else Print("1/3 + 4/3 != 5/3");
// Результат: 1/3 + 4/3 != 5/3
}

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

Пример:

bool EqualDoubles(double d1,double d2,double epsilon)
{
if(epsilon<0) epsilon=-epsilon;
//---
if(d1-d2>epsilon) return false;
if(d1-d2<-epsilon) return false;
//---
return true;
}
void OnStart()
{
double d_val=0.7;
float f_val=0.7;
if(EqualDoubles(d_val,f_val,0.000000000000001)) Print(d_val,"equals",f_val);
else Print("Different: d_val = ",DoubleToString(d_val,16),
" f_val = ",DoubleToString(f_val,16));
// Результат: Different: d_val= 0.7000000000000000 f_val= 0.6999999880790710
}

Необходимо отметить, что значение параметра epsilon в приведенном примере не может быть меньше предопределенной константы DBL_EPSILON. Значение этой константы 2.2204460492503131e-016. Для типа float соответствующая константа FLT_EPSILON = 1.192092896e-07. Смысл этих значений таков, что это наименьшее значение, удовлетворяющее условию 1.0+DBL_EPSILON != 1.0 (для чисел типа float 1.0+FLT_EPSILON != 1.0).

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

Пример:

bool CompareDoubles(double number1,double number2)
{
if(NormalizeDouble(number1-number2,8)==0) return(true);
else return(false);
}
void OnStart()
{
double d_val=0.3;
float f_val=0.3;
if(CompareDoubles(d_val,f_val)) Print(d_val,"equals",f_val);
else Print("Different: d_val = ",DoubleToString(d_val,16),
" f_val = ",DoubleToString(f_val,16));
// Результат: Different: d_val= 0.3000000000000000 f_val= 0.3000000119209290
}

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

Пример:

double abnormal = MathArcsin(2.0);
Print("MathArcsin(2.0) =",abnormal);
// Результат: MathArcsin(2.0) = -1.#IND

Кроме минус бесконечности существуют плюс бесконечность и NaN (не число). Чтобы определить, что данное число недействительно, можно использовать функцию MathIsValidNumber(). По стандарту IEEE они имеют специальное машинное представление. Например, плюс бесконечность для типа double имеет битовое представление 0x7FF0 0000 0000 0000.

Примеры:

struct str1
{
double d;
};
struct str2
{
long l;
};

//--- начнем
str1 s1;
str2 s2;
//---
s1.d=MathArcsin(2.0); // получим недействительное число -1.#IND
s2=s1;
printf("1. %f %I64X",s1.d,s2.l);
//---
s2.l=0xFFFF000000000000; // недействительное число -1.#QNAN
s1=s2;
printf("2. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FF7000000000000; // наиобльшее нечисло SNaN
s1=s2;
printf("3. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FF8000000000000; // наименьшее нечисло QNaN
s1=s2;
printf("4. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FFF000000000000; // наибольшее нечисло QNaN
s1=s2;
printf("5. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FF0000000000000; // плюс бесконечность 1.#INF и наименьшее нечисло SNaN
s1=s2;
printf("6. %f %I64X",s1.d,s2.l);
//---
s2.l=0xFFF0000000000000; // минус бесконечность -1.#INF
s1=s2;
printf("7. %f %I64X",s1.d,s2.l);
//---
s2.l=0x8000000000000000; // отрицательный ноль -0.0
s1=s2;
printf("8. %f %I64X",s1.d,s2.l);
//---
s2.l=0x3FE0000000000000; // 0.5
s1=s2;
printf("9. %f %I64X",s1.d,s2.l);
//---
s2.l=0x3FF0000000000000; // 1.0
s1=s2;
printf("10. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FEFFFFFFFFFFFFF; // наибольшее нормализованное число (MAX_DBL)
s1=s2;
printf("11. %.16e %I64X",s1.d,s2.l);
//---
s2.l=0x0010000000000000; // наименьшее положительное нормализованное (MIN_DBL)
s1=s2;
printf("12. %.16e %.16I64X",s1.d,s2.l);
//---
s1.d=0.7; // покажем, что число 0.7 – бесконечная дробь
s2=s1;
printf("13. %.16e %.16I64X",s1.d,s2.l);
/*
1. -1.#IND00 FFF8000000000000
2. -1.#QNAN0 FFFF000000000000
3. 1.#SNAN0 7FF7000000000000
4. 1.#QNAN0 7FF8000000000000
5. 1.#QNAN0 7FFF000000000000
6. 1.#INF00 7FF0000000000000
7. -1.#INF00 FFF0000000000000
8. -0.000000 8000000000000000
9. 0.500000 3FE0000000000000
10. 1.000000 3FF0000000000000
11. 1.7976931348623157e+308 7FEFFFFFFFFFFFFF
12. 2.2250738585072014e-308 0010000000000000
13. 6.9999999999999996e-001 3FE6666666666666
*/

Смотри также

DoubleToString, NormalizeDouble, Константы числовых типов


Тип string

Справочник MQL4 / Основы языка / Типы данных / Тип string

Тип string

Тип string предназначен для хранения текстовых строк. Текстовая строка представляет собой последовательность символов в формате Unicode с завершающим нулем на конце. string-переменной может быть назначена строковая константа. Строковая константа представляет собой последовательность символов Unicode, заключенную в двойные кавычки: "Это строковая константа".

Если необходимо ввести в строку двойную кавычку ("), то перед ней надо поставить символ обратной косой черты (\). В строку могут быть введены любые специальные символьные константы, перед которыми стоит символ обратной косой черты (\).

Примеры:

string svar="This is a character string";
string svar2=StringSubstr(svar,0,4);
Print("Символ копирайта\t\x00A9");
FileWrite(handle,"эта строка содержит символ перевода строки \n");
string MT4path="C:\\Program Files\\MetaTrader 4";

Длинные константные строки для удобства чтения исходного кода можно разбивать на части без операции сложения. Эти части при компиляции автоматически соберутся в одну длинную строку:

//--- объявим длинную константную строку
string HTML_head="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""
" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
"<head>\n"
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"
"<title>Trade Operations Report</title>\n"
"</head>";
//--- выведем в журнал константную строку
Print(HTML_head);
}

Внутреннее представление строки - структура размером 12 байт:

#pragma pack(push,1)
struct MqlString
{
int size; // 32-битное целое, содержит размер распределенного для строки буфера
LPWSTR buffer; // 32-разрядный адрес буфера, содержащего строку
int reserved; // 32-битное целое, зарезервировано, не использовать
};
#pragma pack(pop,1)

Смотри также

Преобразование данных, Строковые функции, FileOpen(), FileReadString(), FileWriteString()


Структуры и, классы и интерфейсы

Справочник MQL4 / Основы языка / Типы данных / Структуры и, классы и интерфейсы

Структуры, классы и интерфейсы

Структуры

Структура является набором элементов произвольного типа (кроме типа void). Таким образом, структура объединяет логически связанные данные разных типов.

Объявление структуры

Структурный тип данных определяется следующим описанием:

struct имя_структуры
{
описания_элементов
};

Имя структуры нельзя использовать в качестве идентификатора (имени переменной или функции). Следует иметь ввиду, что в MQL4 элементы структуры следуют непосредственно друг за другом без выравнивания. В языке C++ такое указание делается компилятору с помощью инструкции

#pragma pack(1)

Если требуется сделать иное выравнивание в структуре, необходимо использовать вспомогательные члены-"заполнители" нужных размеров.

Пример:

struct trade_settings
{
uchar slippage; // значение допустимого проскальзывания -размер 1 байт
char reserved1; // 1 байт пропуска
short reserved2; // 2 байта пропуска
int reserved4; // еще 4 байта пропуска. Обеспечили выравнивание на границу 8 байт
double take; // значения цены фиксации прибыли
double stop; // значение цены защитного стопа
};

Такое описание выровненных структур необходимо только для передачи в импортированные dll-функции.

Внимание: данный пример иллюстрирует неправильно спроектированные данные. Лучше было бы сначала объявить данные take и stop большего размера типа double, а затем объявить член slippage типа uchar. В этом случае внутреннее представление данных будет всегда одинаково независимо от значения, указанного в #pragma pack().

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

Простые структуры

Структуры, которые не содержат строки, объекты класса и объекты динамических массивов, называются простыми структурами; переменные таких структур могут свободно копироваться друг в друга, даже если это разные структуры. Переменные простых структур, а также их массивы можно передавать в качестве параметров в импортируемые из DLL функции.

Доступ к членам структуры

Имя структуры является новым типом данных и позволяет объявлять переменные этого типа. Структура может быть объявлена только один раз в пределах проекта. Доступ к членам структур производится при помощи операции точка (.).

Пример:

struct trade_settings
{
double take; // значения цены фиксации прибыли
double stop; // значение цены защитного стопа
uchar slippage; // значение допустимого проскальзывания
};
//--- создали и проинициализировали переменную типа trade_settings
trade_settings my_set={0.0,0.0,5};
if (input_TP>0) my_set.take=input_TP;

Классы

Классы имеют ряд отличий от структур:

  • в объявлении используется ключевое слово class;
  • по умолчанию все члены класса имеют спецификатор доступа private, если не указано иное. Члены-данные структуры по умолчанию имеют тип доступа public, если не указано иное;
  • объекты классов всегда имеют таблицу виртуальных функций, даже если в классе не объявлено ни одной виртуальной функции. Структуры не могут иметь виртуальных функций;
  • к объектам класса можно применять оператор new, к структурам этот оператор применять нельзя;
  • классы могут наследоваться только от классов, структуры могут наследоваться только от структур.

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

Пример:

struct trade_settings
{
double take; // значения цены фиксации прибыли
double stop; // значение цены защитного стопа
uchar slippage; // значение допустимого проскальзывания
//--- конструктор
trade_settings() { take=0.0; stop=0.0; slippage=5; }
//--- деструктор
~trade_settings() { Print("Это конец"); }
};
//--- компилятор выдаст ошибку с сообщением о невозможности инициализации
trade_settings my_set={0.0,0.0,5};

Конструкторы и деструкторы

Конструктор - это специальная функция, которая вызывается автоматически при создании объекта структуры или класса и обычно используется для инициализации членов класса. Далее мы будем говорить только о классах, при этом все сказанное относится и к структурам, если не оговорено иное. Имя конструктора должно совпадать с именем класса. Конструктор не имеет возвращаемого типа (можно указать тип void).

Определенные члены класса – строки, динамические массивы и объекты, требующие инициализации – в любом случае будут проинициализированы, независимо от наличия конструктора.

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

Конструктор, не имеющий параметров, называется конструктором по умолчанию. Если в классе не объявлен ни один конструктор, то компилятор сам создаст конструктор по умолчанию при компиляции.

//+------------------------------------------------------------------+
//| Класс для работы с датой |
//+------------------------------------------------------------------+
class MyDateClass
{
private:
int m_year; // год
int m_month; // месяц
int m_day; // день месяца
int m_hour; // час в сутках
int m_minute; // минуты
int m_second; // секунды
public:
//--- конструктор по умолчанию
MyDateClass(void);
//--- конструктор с параметрами
MyDateClass(int h,int m,int s);
};

Конструктор можно объявить в описании класса, а затем определить его тело. Например, вот так могут быть определены два конструктора класса MyDateClass:

//+------------------------------------------------------------------+
//| Конструктор по умолчанию |
//+------------------------------------------------------------------+
MyDateClass::MyDateClass(void)
{
//---
MqlDateTime mdt;
datetime t=TimeCurrent(mdt);
m_year=mdt.year;
m_month=mdt.mon;
m_day=mdt.day;
m_hour=mdt.hour;
m_minute=mdt.min;
m_second=mdt.sec;
Print(__FUNCTION__);
}
//+------------------------------------------------------------------+
//| Конструктор с параметрами |
//+------------------------------------------------------------------+
MyDateClass::MyDateClass(int h,int m,int s)
{
MqlDateTime mdt;
datetime t=TimeCurrent(mdt);
m_year=mdt.year;
m_month=mdt.mon;
m_day=mdt.day;
m_hour=h;
m_minute=m;
m_second=s;
Print(__FUNCTION__);
}

В конструкторе по умолчанию заполняются все члены класса с помощью функции TimeCurrent(), в конструкторе с параметрами заполняются только значения часа. Остальные члены класса (m_year, m_month и m_day) будут проинициализированы автоматически текущей датой.

Конструктор по умолчанию имеет специальное назначение при инициализации массива объектов своего класса. Конструктор, все параметры которого имеют значения по умолчанию, не является конструктором по умолчанию. Покажем это на примере:

//+------------------------------------------------------------------+
//| Класс с конструктором по умолчанию |
//+------------------------------------------------------------------+
class CFoo
{
datetime m_call_time; // время последнего обращения к объекту
public:
//--- конструктор с параметром, имеющем значение по умолчанию, не является конструктором по умолчанию
CFoo(const datetime t=0){m_call_time=t;};
//--- конструктор копирования
CFoo(const CFoo &foo){m_call_time=foo.m_call_time;};

string ToString(){return(TimeToString(m_call_time,TIME_DATE|TIME_SECONDS));};
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
// CFoo foo; // такой вариант использовать нельзя - конструктор по умолчанию не задан
//--- допустимые варианты создания объекта CFoo
CFoo foo1(TimeCurrent()); // явный вызов параметрического конструктора
CFoo foo2(); // явный вызов параметрического конструктора с параметром по умолчанию
CFoo foo3=D'2009.09.09'; // неявный вызов параметрического конструктора
CFoo foo40(foo1); // явный вызов конструктора копирования
CFoo foo41=foo1; // неявный вызов конструктора копирования
CFoo foo5; // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
// то вызывается параметрический конструктор с параметром по умолчанию)
//--- допустимые варианты получения указателей CFoo
CFoo *pfoo6=new CFoo(); // динамическое создание объекта и получение указателя на него
CFoo *pfoo7=new CFoo(TimeCurrent());// ещё один вариант динамического создания объекта
CFoo *pfoo8=GetPointer(foo1); // теперь pfoo8 указывает на объект foo1
CFoo *pfoo9=pfoo7; // pfoo9 и pfoo7 указывают на один и тот же объект
// CFoo foo_array[3]; // такой вариант использовать нельзя - конструктор по умолчанию не задан
//--- выведем значения m_call_time
Print("foo1.m_call_time=",foo1.ToString());
Print("foo2.m_call_time=",foo2.ToString());
Print("foo3.m_call_time=",foo3.ToString());
Print("foo4.m_call_time=",foo4.ToString());
Print("foo5.m_call_time=",foo5.ToString());
Print("pfoo6.m_call_time=",pfoo6.ToString());
Print("pfoo7.m_call_time=",pfoo7.ToString());
Print("pfoo8.m_call_time=",pfoo8.ToString());
Print("pfoo9.m_call_time=",pfoo9.ToString());
//--- удалим динамически созданные объекты
delete pfoo6;
delete pfoo7;
//delete pfoo8; // удалять pfoo8 явно не нужно, так как он указывает на автоматически созданный объект foo1
//delete pfoo9; // удалять pfoo9 явно не нужно, так как он указывает на тот же объект, что и pfoo7
}

Если раскомментировать в этом примере строки

//CFoo foo_array[3]; // такой вариант использовать нельзя - конструктор по умолчанию не задан

или

//CFoo foo_dyn_array[]; // такой вариант использовать нельзя - конструктор по умолчанию не задан

то компилятор выдаст на них ошибку "default constructor is not defined".

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

//+------------------------------------------------------------------+
//| Класс без конструктора по умолчанию |
//+------------------------------------------------------------------+
class CFoo
{
string m_name;
public:
CFoo(string name) { m_name=name;}
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- при компиляции получим ошибку "default constructor is not defined"
CFoo badFoo[5];
}

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

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

Список инициализации – это список инициализаторов, разделенных запятыми, который идет после двоеточия за списком параметров конструктора и предшествует телу (идет перед открывающей фигурной скобкой). Есть несколько требований:

  • списки инициализации можно использовать только в конструкторах;
  • в списке инициализации нельзя инициализировать члены родителей;
  • после списка инициализации должно идти определение (реализация) функции.

Покажем пример нескольких конструкторов для инициализации членов класса.

//+------------------------------------------------------------------+
//| Класс для хранения фамилии и имени персонажа |
//+------------------------------------------------------------------+
class CPerson
{
string m_first_name; // имя
string m_second_name; // фамилия
public:
//--- пустой конструктор по умолчанию
CPerson() {Print(__FUNCTION__);};
//--- параметрический конструктор
CPerson(string full_name);
//--- конструктор со списком инициализации
CPerson(string surname,string name): m_second_name(surname), m_first_name(name) {};
void PrintName(){PrintFormat("Name=%s Surname=%s",m_first_name,m_second_name);};
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CPerson::CPerson(string full_name)
{
int pos=StringFind(full_name," ");
if(pos>=0)
{
m_first_name=StringSubstr(full_name,0,pos);
m_second_name=StringSubstr(full_name,pos+1);
}
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- получим ошибку "default constructor is not defined"
CPerson people[5];
CPerson Tom="Tom Sawyer"; // Том Сойер
CPerson Huck("Huckleberry","Finn"); // Гекльберри Финн
CPerson *Pooh = new CPerson("Winnie","Pooh"); // Винни Пух
//--- выведем значения
Tom.PrintName();
Huck.PrintName();
Pooh.PrintName();

//--- удалим динамически созданный объект
delete Pooh;
}

В данном случае класс CPerson имеет три конструктора:

  1. явный конструктор по умолчанию, который позволяет создавать массив объектов данного класса;
  2. конструктор с одним параметром, который принимает в качестве параметра полное имя и разделяет его на имя и фамилию по найденному пробелу;
  3. конструктор с двумя параметрами, который содержит список инициализации. Инициализаторы – m_second_name(surname) и m_first_name(name).

Обратите внимание, как инициализация с помощью списка заменила присваивание. Отдельные члены должны быть инициализированы как:

член_класса (список выражений)

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

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

//+------------------------------------------------------------------+
//| Базовый класс |
//+------------------------------------------------------------------+
class CFoo
{
string m_name;
public:
//--- конструктор со списком инициализации
CFoo(string name) : m_name(name) { Print(m_name);}
};
//+------------------------------------------------------------------+
//| Потомок класса CFoo |
//+------------------------------------------------------------------+
class CBar : CFoo
{
CFoo m_member; // член класса является объектом предка
public:
//--- конструктор по умолчанию в списке инициализации вызывает конструктор предка
CBar(): m_member(_Symbol), CFoo("CBAR") {Print(__FUNCTION__);}
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
CBar bar;
}

В приведенном примере при создании объекта bar будет вызван конструктор по умолчанию CBar(), в котором сначала вызывается конструктор для предка CFoo, а затем конструктор для члена класса m_member.

Деструктор - это специальная функция, которая вызывается автоматически при уничтожении объекта класса. Имя деструктора записывается как имя класса с тильдой (~). Строки, динамические массивы и объекты, требующие деинициализации, в любом случае будут деинициализированы независимо от наличия деструктора. При наличии деструктора, эти действия будут произведены после вызова деструктора.

Деструкторы всегда являются виртуальными, независимо от того, объявлены они с ключевым слово virtual или нет.

Определение методов классов

Функции-методы класса могут быть определены как внутри класса, так и за пределами объявления класса. Если метод определяется внутри класса, то его тело следует непосредственно после объявления метода.

Пример:

class CTetrisShape
{
protected:
int m_type;
int m_xpos;
int m_ypos;
int m_xsize;
int m_ysize;
int m_prev_turn;
int m_turn;
int m_right_border;
public:
void CTetrisShape();
void SetRightBorder(int border) { m_right_border=border; }
void SetYPos(int ypos) { m_ypos=ypos; }
void SetXPos(int xpos) { m_xpos=xpos; }
int GetYPos() { return(m_ypos); }
int GetXPos() { return(m_xpos); }
int GetYSize() { return(m_ysize); }
int GetXSize() { return(m_xsize); }
int GetType() { return(m_type); }
void Left() { m_xpos-=SHAPE_SIZE; }
void Right() { m_xpos+=SHAPE_SIZE; }
void Rotate() { m_prev_turn=m_turn; if(++m_turn>3) m_turn=0; }
virtual void Draw() { return; }
virtual bool CheckDown(int& pad_array[]);
virtual bool CheckLeft(int& side_row[]);
virtual bool CheckRight(int& side_row[]);
};

Функции с SetRightBorder(int border) по Draw() объявлены и определены прямо внутри класса CTetrisShape.

Конструктор CTetrisShape() и методы CheckDown(int& pad_array[]), CheckLeft(int& side_row[]) и CheckRight(int& side_row[]) только объявлены внутри класса, но пока не определены. Определения этих функций должны следовать далее по коду. Для того чтобы определить метод вне класса используется операция разрешения контекста, в качестве контекста используется имя класса.

Пример:

//+------------------------------------------------------------------+
//| Конструктор базового класса |
//+------------------------------------------------------------------+
void CTetrisShape::CTetrisShape()
{
m_type=0;
m_ypos=0;
m_xpos=0;
m_xsize=SHAPE_SIZE;
m_ysize=SHAPE_SIZE;
m_prev_turn=0;
m_turn=0;
m_right_border=0;
}
//+------------------------------------------------------------------+
//| Проверка возможности двигаться вниз (для палки и куба) |
//+------------------------------------------------------------------+
bool CTetrisShape::CheckDown(int& pad_array[])
{
int i,xsize=m_xsize/SHAPE_SIZE;
//---
for(i=0; i<xsize; i++)
{
if(m_ypos+m_ysize>=pad_array[i]) return(false);
}
//---
return(true);
}

Модификаторы доступа public, protected и private

При разработке нового класса рекомендуется ограничивать доступ к членам извне. Для этих целей используются ключевые слова private или protected. Доступ в этом случае к сокрытым данным может осуществляться только из функций-методов этого же класса. Если использовано ключевое слово protected, то доступ к сокрытым данным может осуществляться и из методов классов - наследников этого класса. Точно таким же образом может ограничиваться доступ и к функциям-методам класса.

Если необходимо полностью открыть доступ к членам и/или методам класса, то используется ключевое слово public.

Пример:

class CTetrisField
{
private:
int m_score; // счёт
int m_ypos; // текущее положение фигуры
int m_field[FIELD_HEIGHT][FIELD_WIDTH]; // матрица стакана
int m_rows[FIELD_HEIGHT]; // нумерация рядов стакана
int m_last_row; // последний свободный ряд
CTetrisShape *m_shape; // тетрисная фигура
bool m_bover; // игра закончена
public:
void CTetrisField() { m_shape=NULL; m_bover=false; }
void Init();
void Deinit();
void Down();
void Left();
void Right();
void Rotate();
void Drop();
private:
void NewShape();
void CheckAndDeleteRows();
void LabelOver();
};

Любые члены и методы класса, объявленные после спецификатора public: (и до следующего спецификатора доступа), доступны при любом обращении программы к объекту этого класса. В данном примере это следующие члены: функции CTetrisField(), Init(), Deinit(), Down(), Left(), Right(), Rotate() и Drop().

Любые члены класса, объявленные после спецификатора доступа к элементам private: (и до следующего спецификатора доступа), доступны только функциям-членам этого класса. Спецификаторы доступа к элементам всегда заканчиваются двоеточием (:) и могут появляться в определении класса много раз.

Доступ к членам базового класса может переопределяться при наследовании в производных классах.

Модификатор final

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

class CFoo final
{
//--- тело класса
};

class CBar : public CFoo
{
//--- тело класса
};

При попытке наследования от класса с модификатором final, как показано в примере выше, компилятор выдаст ошибку:

cannot inherit from 'CFoo' as it has been declared as 'final'
see declaration of 'CFoo'

Объединение (union)

Объединение – это особый тип данных, который состоит из нескольких переменных, разделяющих одну и ту же область памяти. Следовательно, объединение обеспечивает возможность интерпретации одной и той же последовательности битов двумя (или более) различными способами. Объявление объединения подобно объявлению структуры и начинается с ключевого слова union.

union LongDouble
{
long long_value;
double double_value;
};

Но в отличие от структуры, разные члены объединения относятся к одному и тому же участку памяти. В данном примере объявлено объединение LongDouble, в котором значение типа long и значение типа double разделяют одну и ту же область памяти. Важно понимать - невозможно сделать так, чтобы это объединение хранило одновременно целочисленное значение long и вещественное double (как это было бы в структуре), поскольку переменные long_value и double_value накладываются (в памяти) друг на друга. Но зато MQL5-программа в любой момент может обрабатывать информацию, содержащуюся в этом объединении, как целочисленное значение (long) или как вещественное (double). Следовательно, объединение позволяет получить два (или больше) варианта представления одной и той же последовательности данных.

При объявлении объединения компилятор автоматически выделяет область памяти, достаточную для хранения в объединении переменных самого большого по объему типа. Для доступа к элементу объединения используется тот же синтаксис, как и для структур – оператор "точка".

union LongDouble
{
long long_value;
double double_value;
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
LongDouble lb;
//--- получим недействительное число -nan(ind) и выведем его
lb.double_value=MathArcsin(2.0);
printf("1. double=%f integer=%I64X",lb.double_value,lb.long_value);
//--- наибольшее нормализованное число (DBL_MAX)
lb.long_value=0x7FEFFFFFFFFFFFFF;
printf("2. double=%.16e integer=%I64X",lb.double_value,lb.long_value);
//--- наименьшее положительное нормализованное (DBL_MIN)
lb.long_value=0x0010000000000000;
printf("3. double=%.16e integer=%.16I64X",lb.double_value,lb.long_value);
}
/* Результат выполнения
1. double=-nan(ind) integer=FFF8000000000000
2. double=1.7976931348623157e+308 integer=7FEFFFFFFFFFFFFF
3. double=2.2250738585072014e-308 integer=0010000000000000
*/

Поскольку объединения позволяют программе интерпретировать одни и те же данные в памяти по-разному, они часто используются в случаях, когда требуется необычное преобразование типов.

Объединения не могут участвовать в наследовании, а также они не могут иметь статических членов по определению. В остальном union ведёт себя как структура, у которой все члены имеют нулевое смещение. При этом членами объединения не могут быть следующие типы:

  • динамические массивы
  • строки
  • указатели на объекты и функции
  • объекты классов
  • объекты структур, имеющие конструкторы или деструкторы
  • объекты структур, имеющие в себе члены из пунктов 1-5

Также как и классы, объединение может иметь конструкторы и деструкторы, а также и методы. По умолчанию члены объединения имеют тип доступа public, для создания закрытых элементов необходимо использовать ключевое слово private. Все эти возможности представлены в примере, который показывает как преобразовать цвет, имеющий тип color, в представление ARGB, как это делает функция ColorToARGB().

//+------------------------------------------------------------------+
//| Объединение для конвертации color(BGR) в представление ARGB |
//+------------------------------------------------------------------+
union ARGB
{
uchar argb[4];
color clr;
//--- конструкторы
ARGB(color col,uchar a=0){Color(col,a);};
~ARGB(){};
//--- публичные методы
public:
uchar Alpha(){return(argb[3]);};
void Alpha(const uchar alpha){argb[3]=alpha;};
color Color(){ return(color(clr));};
//--- закрытые методы
private:
//+------------------------------------------------------------------+
//| установка цвета и значения альфа-канала |
//+------------------------------------------------------------------+
void Color(color col,uchar alpha)
{
//--- установим цвет в член clr
clr=col;
//--- установим значение компонента Alpha - уровня непрозрачности
argb[3]=alpha;
//--- переставим местами байты компонент R и B (Red и Blue)
uchar t=argb[0];argb[0]=argb[2];argb[2]=t;
};
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- значение 0x55 означает 55/255=21.6 % (0% - полностью прозрачный)
uchar alpha=0x55;
//--- тип color имеет представление 0x00BBGGRR
color test_color=clrDarkOrange;
//--- сюда будем принимать значения байтов из объединения ARGB
uchar argb[];
PrintFormat("0x%.8X - так выглядит тип color для %s, BGR=(%s)",
test_color,ColorToString(test_color,true),ColorToString(test_color));
//--- тип ARGB представлен как 0x00RRGGBB, переставлены местами RR и BB компоненты
ARGB argb_color(test_color);
//--- скопируем массив байтов
ArrayCopy(argb,argb_color.argb);
//--- посмотрим как выглядит в представлении ARGB
PrintFormat("0x%.8X - представление ARGB c альфа-каналом=0x%.2x, ARGB=(%d,%d,%d,%d)",
argb_color.clr,argb_color.Alpha(),argb[3],argb[2],argb[1],argb[0]);
//--- добавим значение непрозрачности
argb_color.Alpha(alpha);
//--- попробуем вывести ARGB как тип color
Print("ARGB как color=(",argb_color.clr,") альфа-канал=",argb_color.Alpha());
//--- скопируем массив байтов
ArrayCopy(argb,argb_color.argb);
//--- а вот как выглядит в представлении ARGB
PrintFormat("0x%.8X - представление ARGB c альфа-каналом=0x%.2x, ARGB=(%d,%d,%d,%d)",
argb_color.clr,argb_color.Alpha(),argb[3],argb[2],argb[1],argb[0]);
//--- сверим с тем, что выдает функция ColorToARGB()
PrintFormat("0x%.8X - результат ColorToARGB(%s,0x%.2x)",ColorToARGB(test_color,alpha),
ColorToString(test_color,true),alpha);
}
/* Результат выполнения
0x00008CFF - так выглядит тип color для clrDarkOrange, BGR=(255,140,0)
0x00FF8C00 - представление ARGB c альфа-каналом=0x00, ARGB=(0,255,140,0)
ARGB как color=(0,140,255) альфа-канал=85
0x55FF8C00 - представление ARGB c альфа-каналом=0x55, ARGB=(85,255,140,0)
0x55FF8C00 - результат ColorToARGB(clrDarkOrange,0x55)
*/

Интерфейсы

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

Определяется интерфейс с помощью ключевого слова interface, как показано в примере:

//--- базовый интерфейс для описания животных
interface IAnimal
{
//--- методы интерфейса по умолчанию имеют public-доступ
void Sound(); // звук, который издает животное
};
//+------------------------------------------------------------------+
//| класс CCat наследуется от интерфейса IAnimal |
//+------------------------------------------------------------------+
class CCat : public IAnimal
{
public:
CCat() { Print("Cat was born"); }
~CCat() { Print("Cat is dead"); }
//--- реализуем метод Sound интерфейса IAnimal
void Sound(){ Print("meou"); }
};
//+------------------------------------------------------------------+
//| класс CDog наследуется от интерфейса IAnimal |
//+------------------------------------------------------------------+
class CDog : public IAnimal
{
public:
CDog() { Print("Dog was born"); }
~CDog() { Print("Dog is dead"); }
//--- реализуем метод Sound интерфейса IAnimal
void Sound(){ Print("guaf"); }
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- массив указателей на объекты типа IAnimal
IAnimal *animals[2];
//--- породим потомков IAnimal и сохраним указатели на них в массив
animals[0]=new CCat;
animals[1]=new CDog;
//--- вызовем метод Sound() базового интерфейса IAnimal для каждого потомка
for(int i=0;i<ArraySize(animals);++i)
animals[i].Sound();
//--- удалим объекты
for(int i=0;i<ArraySize(animals);++i)
delete animals[i];
//--- результат выполнения
/*
Cat was born
Dog was born
meou
guaf
Cat is dead
Dog is dead
*/
}

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

Интерфейс нельзя объявить внутри объявления класса или структуры, но при этом указатель на интерфейс можно сохранить в переменную типа void *. Вообще говоря, в переменную типа void * можно сохранить указатель на объект любого класса. Для того чтобы преобразовать указатель void * в указатель на объект конкретного класса, необходимо использовать оператор dynamic_cast. В случае, когда преобразование невозможно, результатом операции dynamic_cast будет NULL.

Смотри также

Объектно-ориентированное программирование


Объект динамического массива

Справочник MQL4 / Основы языка / Типы данных / Объект динамического массива

Объект динамического массива

Динамические массивы

Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.

Динамические массивы автоматически освобождаются при выходе за пределы области видимости блока, в котором они объявлены.

Пример:

double matrix[][10][20]; // 3-мерный динамический массив
ArrayResize(matrix,5); // задали размер первого измерения

Статические массивы

При явном указании всех значимых размерностей массива компилятор заранее распределяет необходимый размер памяти. Такой массив называется статическим. Тем не менее, компилятор дополнительно распределяет память под объект динамического массива, который (объект) связан с заранее распределенным статическим буфером (областью памяти для хранения массива).

Создание объекта динамического массива обусловлено возможной необходимостью передавать данный статический массив в качестве параметра в какую-либо функцию.

Примеры:

double stat_array[5]; // 1-мерный статический массив
some_function(stat_array);
...
bool some_function(double& array[])
{
if(ArrayResize(array,100)<0) return(false);
...
return(true);
}

Массивы в составе структур

При объявлении статического массива в качестве члена структуры объект динамического массива не создается. Это сделано для совместимости структур данных, используемых в Windows API.

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

Смотри также

Операции с массивами, Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Приведение типов

Справочник MQL4 / Основы языка / Типы данных / Приведение типов

Приведение типов

Преобразование числовых типов

Часто возникает необходимость преобразовать один числовой тип в другой. Не каждый числовой тип допустимо преобразовать в другой, допустимые преобразования в MQL4 показаны на схеме:

Схема допустимых преобразований типов

Сплошные линии со стрелками обозначают преобразования, которые выполняются без потери информации. Вместо типа char может выступать тип bool (оба занимают в памяти 1 байт), вместо типа int можно использовать тип color (по 4 байта), а вместо типа long допустим тип datetime (занимают по 8 байт). Четыре штриховые линии серого цвета, также со стрелками, означают преобразования, при которых может произойти потеря точности. Например, количество цифр в целом числе 123456789 (int) превышает количество цифр, которое может быть представлено типом float.

int n=123456789;
float f=n; // содержимое f равно 1.234567892E8
Print("n = ",n," f = ",f);
// результат n= 123456789 f= 123456792.00000

Число, преобразованное в тип float, имеет тот же порядок, но несколько меньшую точность. Преобразования, обратные черным стрелкам, осуществляется с возможной потерей информацией. Преобразования между char и uchar, short и ushort, int и uint, long и ulong (имеются ввиду преобразования в обе стороны), могут привести к потере информации.

В результате преобразования значения с плавающей точкой к целому типу дробная часть числа всегда отбрасывается. Если нужно округлить число с плавающей точкой до ближайшего целого числа (что во многих случаях является более полезным), необходимо использовать функцию MathRound().

Пример:

//--- ускорение свободного падения
double g=9.8;
double round_g=(int)g;
double math_round_g=MathRound(g);
Print("round_g = ",round_g);
Print("math_round_g =",math_round_g);
/*
Результат:
round_g = 9
math_round_g = 10
*/

Если два значения объединяются бинарным оператором, то перед выполнением операции операнд младшего типа преобразовывается к более старшему типу в соответствии с приоритетом, указанным на схеме:

Преобразования при объединении бинарной операцией

Типы данных char, uchar, short и ushort в операциях безусловно приводятся к типу int.

Примеры:

char c1=3;
//--- первый пример
double d2=c1/2+0.3;
Print("c1/2+0.3 = ",d2);
// Результат: c1/2+0.3 = 1.3

//--- второй пример
d2=c1/2.0+0.3;
Print("c1/2.0+0.3 = ",d2);
// Результат: c1/2.0+0.3 = 1.8

Вычисляемое выражение состоит из двух операций. В первом примере переменная c1 типа char преобразуется ко временной переменной типа int, так как второй операнд в операции деления, константа 2, имеет более старший тип int. В результате целочисленного деления 3/2 получается значение 1, которое имеет тип int.

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

Во втором примере переменная c1 типа char преобразуется ко временной переменной типа double, так как второй операнд в операции деления, константа 2.0, имеет тип double; дальнейших преобразований не производится.

Приведение числовых типов

В выражениях языка MQL4 можно использовать как явное, так и неявное приведение типов. Явное преобразование типов записывается следующим образом:

var_1 = (тип)var_2;

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

var_1 = тип(var_2);

Рассмотрим явное преобразование на основании первого примера.

//--- третий пример
double d2=(double)c1/2+0.3;
Print("(double)c1/2+0.3 = ",d2);
// Результат: (double)c1/2+0.3 = 1.80000000

Перед выполнением операции деления переменная c1 явно приводится к типу double. Теперь уже целочисленная константа 2 приводится к значению 2.0 типа double, так как в результате преобразования первый операнд получил тип double. Фактически, явное преобразование типов является одноместной операцией.

Кроме того, при попытке приведения типов результат может выйти за пределы допустимого диапазона. В этом случае произойдет усечение. Например:

char c;
uchar u;
c=400;
u=400;
Print("c = ",c); // результат с=-112
Print("u = ",u); // результат u=144

Перед выполнением операций (кроме операций присваивания) происходит преобразование в тип, имеющий наибольший приоритет, а перед операциями присваивания - в целевой тип.

Примеры:

int i=1/2; // приведения типов нет, результат: 0
Print("i = 1/2 ",i);

int k=1/2.0; // выражение приводится к типу double,
Print("k = 1/2 ",k); // затем приводится к целевому типу int, результат: 0

double d=1.0/2.0; // приведения типов нет, результат: 0.5
Print("d = 1/2.0; ",d);

double e=1/2.0; // выражение приводится к типу double,
Print("e = 1/2.0; ",e);// который совпадает с целевым типом, результат: 0.5

double x=1/2; // выражение типа int приводится к целевому типу double,
Print("x = 1/2; ",x); // результат: 0.0

При преобразовании типа long/ulong в double может произойти потеря точности: если целое больше 9223372036854774784 или меньше -9223372036854774784.

void OnStart()
{
long l_max=LONG_MAX;
long l_min=LONG_MIN+1;
//--- найдем максимальное целое, которое не теряет точности при приведении к double
while(l_max!=long((double)l_max))
l_max--;
//--- найдем минимальное целое, которое не теряет точности при приведении к double
while(l_min!=long((double)l_min))
l_min++;
//--- теперь выведем найденный интервал для целых чисел
PrintFormat("При приведении целого числа к double оно должно "
"быть в интервале [%I64d, %I64d]",l_min,l_max);
//--- теперь посмотрим, что произойдет, если число выходит за этот интервал
PrintFormat("l_max+1=%I64d, double(l_max+1)=%.f, ulong(double(l_max+1))=%I64d",
l_max+1,double(l_max+1),long(double(l_max+1)));
PrintFormat("l_min-1=%I64d, double(l_min-1)=%.f, ulong(double(l_min-1))=%I64d",
l_min-1,double(l_min-1),long(double(l_min-1)));
//--- получим такой вывод
// При приведении целого числа к double оно должно быть в интервале [-9223372036854774784, 9223372036854774784]
// l_max+1=9223372036854774785, double(l_max+1)=9223372036854774800, ulong(double(l_max+1))=9223372036854774784
// l_min-1=-9223372036854774785, double(l_min-1)=-9223372036854774800, ulong(double(l_min-1))=-9223372036854774784
}

Приведения для типа string

Тип string имеет самый высокий приоритет среди простых типов. Поэтому, если в операции один из операндов имеет тип string, то другой операнд будет приведен к типу string автоматически. Следует иметь ввиду, что для типа string допустима единственная двуместная операция сложения. Допустимо явное приведение переменной типа string к любому числовому типу.

Примеры:

string s1=1.0/8; // выражение приводится к типу double,
Print("s1 = 1.0/8; ",s1); // затем к целевому типу string,
// результат:"0.12500000"(строка, содержащая 10 символов)

string s2=NULL; // деинициализация строки
Print("s2 = NULL; ",s2); // результат: пустая строка
string s3="Ticket N"+12345; // выражение приводится к типу string
Print("s = \"Ticket N\"+12345 ",s3);

string str1="true";
string str2="0,255,0";
string str3="2009.06.01";
string str4="1.2345e2";
Print(bool(str1));
Print(color(str2));
Print(datetime(str3));
Print(double(str4));

Приведение данных типа простых структур

Данные типа простых структур можно присваивать друг другу только в том случае, если все члены обеих структур имеют числовые типы. При этом в операции присваивания оба операнда, и слева и справа, должны быть типа структур. Как такового почленного приведения не производится, производится простое копирование. Если размеры структур отличаются, то копируется количество байт, соответствующее меньшему размеру. Таким образом компенсируется отсутствие объединений (union) в языке MQL4.

Примеры:

struct str1
{
double d;
};
//---
struct str2
{
long l;
};
//---
struct str3
{
int low_part;
int high_part;
};
//+------------------------------------------------------------------+
void OnStart()
{
str1 s1;
str2 s2;
str3 s3;
//---
s1.d=MathArcsin(2.0); // получим недействительное число -1.#IND
s2=s1;
printf("1. %f %I64X",s1.d,s2.l);
//---
s3=s2;
printf("2. high part of long %.8X low part of long %.8X",
s3.high_part,s3.low_part);
}

Еще один пример показывает, как можно организовать собственную функцию для получения из типа color представления цвета в RGB (Red,Green,Blue). Для этого создаем две структуры, имеющие одинаковый размер, но разный внутренний состав. Для удобства, добавим в структуру функцию, возвращающую цвет в представлении RGB в виде строки.

#property script_show_inputs
input color testColor=clrBlue;// задайте цвет для тестирования
//--- структура для представления цвета в RGB
struct RGB
{
uchar blue; // синяя составляющая цвета
uchar green; // зеленая составляющая цвета
uchar red; // красная составляющая цвета
uchar empty; // этот байт не используется
string toString(); // функция для получения в виде строки
};
//--- функция для вывода цвета в виде строки
string RGB::toString(void)
{
string out="("+(string)red+":"+(string)green+":"+(string)blue+")";
return out;
}
//--- структура для хранения встроенного типа color
struct builtColor
{
color c;
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- переменная для хранения в RGB
RGB colorRGB;
//--- переменная для хранения типа color
builtColor test;
test.c=testColor;
//--- приведение двух структур путем копирования содержимого
colorRGB=test;
Print("color ",test.c," = ",colorRGB.toString());
//---
}

Приведение типов указателей базовых классов к указателям производных классов

Объекты открыто порожденного класса могут также рассматриваться как объекты соответствующего ему базового класса. Это ведет к некоторым интересным следствиям. Например, вопреки тому факту, что объекты различных классов, порожденных одним базовым классом, могут существенно отличаться друг от друга, мы можем создать их связанный список (List), поскольку мы рассматриваем их как объекты базового типа. Но обратное неверно: объекты базового класса не являются автоматически объектами производного класса.

Можно использовать явное приведение типов для преобразования указателей базового класса в указатели производного класса. Но необходимо быть полностью уверенным в допустимости такого преобразования, так как в противном случае возникнет критическая ошибка времени выполнения и mql4-программа будет остановлена.

Динамическое приведение типов с помощью оператора dynamic_cast

Существует возможность динамического приведения типов с помощью оператора dynamic_cast, который может быть применён только к указателям классов. При этом проверка корректности типов производится в момент выполнения программы. Это означает, что при использовании оператора dynamic_cast компилятор не производит проверку типа данных, используемого для приведения. В случае, если осуществляется преобразование указателя к типу данных, который не является фактическим типом объекта, результатом будет значение NULL.

dynamic_cast <type-id> ( expression )

Параметр type-id в угловых скобках должен быть указателем на ранее определённый тип класса. Тип операнда expression (в отличии от C++) может быть любым, кроме void.

Пример:

class CBar { };
class CFoo : public CBar { };

void OnStart()
{
CBar bar;
//--- динамическое приведение типа указателя *bar к указателю *foo разрешено
CFoo *foo = dynamic_cast<CFoo *>(&bar); // критической ошибки выполнения не возникнет
Print(foo); // foo=NULL
//--- попытка явного приведения ссылки объекта типа Bar к объекту типа Foo запрещено
foo=(CFoo *)&bar; // возникнет критическая ошибка выполнения
Print(foo); // эта строка не будет выполнена
}

Смотри также

Типы данных


Тип void и константа NULL

Справочник MQL4 / Основы языка / Типы данных / Тип void и константа NULL

Тип void и константа NULL

Синтаксически тип void является фундаментальным типом наравне с типами char, uchar, bool, short, ushort, int, uint, color, long, ulong, datetime, float, double и string. Этот тип используется либо для указания того, что функция не возвращает значения, либо в качестве параметра функции обозначает отсутствие параметров.

Предопределенная константная переменная NULL имеет тип void. Она может быть присвоена переменным любых других фундаментальных типов без преобразования. Также допускается сравнение переменных фундаментальных типов со значением NULL

Пример:

//--- если строка не инициализирована, то присвоим ей наше предопределенное значение
if(some_string==NULL) some_string="empty";

Также NULL можно сравнивать с указателями на объекты, созданные при помощи оператора new.

Смотри также

Переменные, Функции


Пользовательские типы

Справочник MQL4 / Основы языка / Типы данных / Пользовательские типы

Пользовательские типы

Ключевое слово typedef в языке C++ позволяет создавать пользовательские типы данных – для этого достаточно определить новое имя типа данных для уже существующего типа данных. При этом сам новый тип данных не создается, а лишь определяется новое имя для уже существующего типа. Благодаря использованию пользовательских типов можно делать программы более гибкими: для этого иногда достаточно изменить typedef-инструкции с помощью макросов подстановки (#define). Использование пользовательских типов позволяет также улучшить читабельность кода, поскольку для стандартных типов данных с помощью typedef можно использовать собственные описательные имена. Общий формат записи инструкции для создания пользовательского типа:

typedef тип новое_имя;

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

Указатель на функцию

Указатель на функцию в общем виде определятся форматом записи

typedef тип_результата_функции (*Имя_типа_функции)(список_типов_входных параметров);

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

//--- объявим указатель на функцию, которая принимает два параметра типа int
typedef int (*TFunc)(int,int);
//--- TFunc является типом и мы можем объявить переменную-указатель на функцию
TFunc func_ptr; // указатель на функцию
//--- объявим функции, которые соответствуют описанию TFunc
int sub(int x,int y) { return(x-y); } // вычитание одного числа из другого
int add(int x,int y) { return(x+y); } // сложение двух чисел
int neg(int x) { return(~x); } // инвертирование битов в переменной
//--- в переменную func_ptr можно сохранить адрес функции, чтобы в дальнейшем ее вызывать
func_ptr=sub;
Print(func_ptr(10,5));
func_ptr=add;
Print(func_ptr(10,5));
func_ptr=neg; // ошибка: neg не имеет тип int (int,int)
Print(func_ptr(10)); // ошибка: должно быть два параметра

В данном примере переменной func_ptr можно присвоить функции sub и add, поскольку они имеют по два входных параметра типа int, как это указано в определении указателя на функцию TFunc. А вот функция neg не может быть присвоена указателю func_ptr, так как ее сигнатура отличается.

Организации событийных моделей в пользовательском интерфейсе

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

//--- создадим пользовательский тип функции
typedef int(*TAction)(string,int);
//+------------------------------------------------------------------+
//| Открывает файл |
//+------------------------------------------------------------------+
int Open(string name,int id)
{
PrintFormat("Вызвана функция %s (name=%s id=%d)",__FUNCTION__,name,id);
return(1);
}
//+------------------------------------------------------------------+
//| Сохраняет файл |
//+------------------------------------------------------------------+
int Save(string name,int id)
{
PrintFormat("Вызвана функция %s (name=%s id=%d)",__FUNCTION__,name,id);
return(2);
}
//+------------------------------------------------------------------+
//| Закрывает файл |
//+------------------------------------------------------------------+
int Close(string name,int id)
{
PrintFormat("Вызвана функция %s (name=%s id=%d)",__FUNCTION__,name,id);
return(3);
}

Затем произведем класс MyButton от CButton, в котором добавим член TAction, являющийся указателем на функцию.

//+------------------------------------------------------------------+
//| Создадим свой класс кнопки с функцией обработки событий |
//+------------------------------------------------------------------+
class MyButton: public CButton
{
private:
TAction m_action; // обработчик событий графика
public:
MyButton(void){}
~MyButton(void){}
//--- конструктор с указанием текста кнопки и указателя на функцию для обработки событий
MyButton(string text, TAction act)
{
Text(text);
m_action=act;
}
//--- установка собственной функции, которая будет вызываться из обработчика событий OnEvent()
void SetAction(TAction act){m_action=act;}
//--- стандартный обработчик событий графика
virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam) override
{
if(m_action!=NULL & lparam==Id())
{
//--- вызовем собственный обработчик m_action()
m_action(sparam,(int)lparam);
return(true);
}
else
//--- вернем результат вызова обработчика из родительского класса CButton
return(CButton::OnEvent(id,lparam,dparam,sparam));
}
};

Далее создадим производный класс CControlsDialog от CAppDialog, в котором добавим массив m_buttons для хранения кнопок типа MyButton, а также методы AddButton(MyButton &button) и CreateButtons().

//+------------------------------------------------------------------+
//| Класс CControlsDialog |
//| Назвначение: графическая панель для управления приложением |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
{
private:
CArrayObj m_buttons; // массив кнопок
public:
CControlsDialog(void){};
~CControlsDialog(void){};
//--- create
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) override;
//--- добавление кнопки
bool AddButton(MyButton &button){return(m_buttons.Add(GetPointer(button)));m_buttons.Sort();};
protected:
//--- создание кнопок
bool CreateButtons(void);
};
//+------------------------------------------------------------------+
//| Создание объекта CControlsDialog на графике |
//+------------------------------------------------------------------+
bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
return(false);
return(CreateButtons());
//---
}
//+------------------------------------------------------------------+
//| defines |
//+------------------------------------------------------------------+
//--- indents and gaps
#define INDENT_LEFT (11) // indent from left (with allowance for border width)
#define INDENT_TOP (11) // indent from top (with allowance for border width)
#define CONTROLS_GAP_X (5) // gap by X coordinate
#define CONTROLS_GAP_Y (5) // gap by Y coordinate
//--- for buttons
#define BUTTON_WIDTH (100) // size by X coordinate
#define BUTTON_HEIGHT (20) // size by Y coordinate
//--- for the indication area
#define EDIT_HEIGHT (20) // size by Y coordinate
//+------------------------------------------------------------------+
//| Создание и добавление кнопок на панель CControlsDialog |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateButtons(void)
{
//--- расчет координат кнопок
int x1=INDENT_LEFT;
int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y);
int x2;
int y2=y1+BUTTON_HEIGHT;
//--- добавим объекты кнопок вместе с указателями на функции
AddButton(new MyButton("Open",Open));
AddButton(new MyButton("Save",Save));
AddButton(new MyButton("Close",Close));
//--- создадим кнопки графически
for(int i=0;i<m_buttons.Total();i++)
{
MyButton *b=(MyButton*)m_buttons.At(i);
x1=INDENT_LEFT+i*(BUTTON_WIDTH+CONTROLS_GAP_X);
x2=x1+BUTTON_WIDTH;
if(!b.Create(m_chart_id,m_name+"bt"+b.Text(),m_subwin,x1,y1,x2,y2))
{
PrintFormat("Failed to create button %s %d",b.Text(),i);
return(false);
}
//--- добавим каждую кнопку в контейнер CControlsDialog
if(!Add(b))
return(false);
}
//--- succeed
return(true);
}

Теперь мы можем написать программу с использованием панели управления CControlsDialog, в которой создается 3 кнопки "Open", "Save" и "Close". При нажатии на кнопку вызывается соответствующая ей функция, которая прописана в виде указателя на функцию TAction.

//--- объявим объект на глобальном уровне, чтобы создать его автоматически при запуске программы
CControlsDialog MyDialog;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- теперь создадим объект на графике
if(!MyDialog.Create(0,"Controls",0,40,40,380,344))
return(INIT_FAILED);
//--- запускаем приложение
MyDialog.Run();
//--- успешная инициализация приложения
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- очистим комментарии при завершении работы приложения
Comment(");
//--- destroy dialog
MyDialog.Destroy(reason);
}
//+------------------------------------------------------------------+
//| Expert chart event function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // event ID
const long& lparam, // event parameter of the long type
const double& dparam, // event parameter of the double type
const string& sparam) // event parameter of the string type
{
//--- для событий графика вызываем обработчик из родительского класса (CAppDialog в данном случае)
MyDialog.ChartEvent(id,lparam,dparam,sparam);
}

Внешний вид запущенного приложения и результаты нажатия кнопок представлены на картинке.

Полный исходный код программы

//+------------------------------------------------------------------+
//| Panel_Buttons.mq5 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Панель с несколькими кнопками CButton"
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
//+------------------------------------------------------------------+
//| defines |
//+------------------------------------------------------------------+
//--- indents and gaps
#define INDENT_LEFT (11) // indent from left (with allowance for border width)
#define INDENT_TOP (11) // indent from top (with allowance for border width)
#define CONTROLS_GAP_X (5) // gap by X coordinate
#define CONTROLS_GAP_Y (5) // gap by Y coordinate
//--- for buttons
#define BUTTON_WIDTH (100) // size by X coordinate
#define BUTTON_HEIGHT (20) // size by Y coordinate
//--- for the indication area
#define EDIT_HEIGHT (20) // size by Y coordinate

//--- создадим пользовательский тип функции
typedef int(*TAction)(string,int);
//+------------------------------------------------------------------+
//| Открывает файл |
//+------------------------------------------------------------------+
int Open(string name,int id)
{
PrintFormat("Вызвана функция %s (name=%s id=%d)",__FUNCTION__,name,id);
return(1);
}
//+------------------------------------------------------------------+
//| Сохраняет файл |
//+------------------------------------------------------------------+
int Save(string name,int id)
{
PrintFormat("Вызвана функция %s (name=%s id=%d)",__FUNCTION__,name,id);
return(2);
}
//+------------------------------------------------------------------+
//| Закрывает файл |
//+------------------------------------------------------------------+
int Close(string name,int id)
{
PrintFormat("Вызвана функция %s (name=%s id=%d)",__FUNCTION__,name,id);
return(3);
}
//+------------------------------------------------------------------+
//| Создадим свой класс кнопки с функцией обработки событий |
//+------------------------------------------------------------------+
class MyButton: public CButton
{
private:
TAction m_action; // обработчик событий графика
public:
MyButton(void){}
~MyButton(void){}
//--- конструктор с указанием текста кнопки и указателя на функцию для обработки событий
MyButton(string text,TAction act)
{
Text(text);
m_action=act;
}
//--- установка собственной функции, которая будет вызываться из обработчика событий OnEvent()
void SetAction(TAction act){m_action=act;}
//--- стандартный обработчик событий графика
virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam) override
{
if(m_action!=NULL & lparam==Id())
{
//--- вызовем собственный обработчик
m_action(sparam,(int)lparam);
return(true);
}
else
//--- вернем результат вызова обработчика из родительского класса CButton
return(CButton::OnEvent(id,lparam,dparam,sparam));
}
};
//+------------------------------------------------------------------+
//| Класс CControlsDialog |
//| Назвначение: графическая панель для управления приложением |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
{
private:
CArrayObj m_buttons; // массив кнопок
public:
CControlsDialog(void){};
~CControlsDialog(void){};
//--- create
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) override;
//--- добавление кнопки
bool AddButton(MyButton &button){return(m_buttons.Add(GetPointer(button)));m_buttons.Sort();};
protected:
//--- создание кнопок
bool CreateButtons(void);
};
//+------------------------------------------------------------------+
//| Создание объекта CControlsDialog на графике |
//+------------------------------------------------------------------+
bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
return(false);
return(CreateButtons());
//---
}
//+------------------------------------------------------------------+
//| Создание и добавление кнопок на панель CControlsDialog |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateButtons(void)
{
//--- расчет координат кнопок
int x1=INDENT_LEFT;
int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y);
int x2;
int y2=y1+BUTTON_HEIGHT;
//--- добавим объекты кнопок вместе с указателями на функции
AddButton(new MyButton("Open",Open));
AddButton(new MyButton("Save",Save));
AddButton(new MyButton("Close",Close));
//--- создадим кнопки графически
for(int i=0;i<m_buttons.Total();i++)
{
MyButton *b=(MyButton*)m_buttons.At(i);
x1=INDENT_LEFT+i*(BUTTON_WIDTH+CONTROLS_GAP_X);
x2=x1+BUTTON_WIDTH;
if(!b.Create(m_chart_id,m_name+"bt"+b.Text(),m_subwin,x1,y1,x2,y2))
{
PrintFormat("Failed to create button %s %d",b.Text(),i);
return(false);
}
//--- добавим каждую кнопку в контейнер CControlsDialog
if(!Add(b))
return(false);
}
//--- succeed
return(true);
}
//--- объявим объект на глобальном уровне, чтобы создать его автоматически при запуске программы
CControlsDialog MyDialog;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- теперь создадим объект на графике
if(!MyDialog.Create(0,"Controls",0,40,40,380,344))
return(INIT_FAILED);
//--- запускаем приложение
MyDialog.Run();
//--- успешная инициализация приложения
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- очистим комментарии при завершении работы приложения
Comment(");
//--- destroy dialog
MyDialog.Destroy(reason);
}
//+------------------------------------------------------------------+
//| Expert chart event function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // event ID
const long& lparam, // event parameter of the long type
const double& dparam, // event parameter of the double type
const string& sparam) // event parameter of the string type
{
//--- для событий графика вызываем обработчика из родительского класса (CAppDialog в данном случае)
MyDialog.ChartEvent(id,lparam,dparam,sparam);
}

Смотри также

Переменные, Функции


Указатели объектов

Справочник MQL4 / Основы языка / Типы данных / Указатели объектов

Указатели объектов

В MQL4 существует возможность динамически создавать объекты сложного типа. Это делается при помощи оператора new, который возвращает описатель созданного объекта. Описатель имеет размер 8 байт. Синтаксически описатели объектов в MQL4 похожи на указатели в C++.

Пример:

MyObject* hobject= new MyObject();

В отличие от C++, переменная hobject из вышеприведенного примера не является указателем на память, а является дескриптором объекта. Кроме того, в языке MQL5 все объекты в параметрах функции обязательно должны передаваться по ссылке. Примеры передачи объектов в качестве параметра функции:

class Foo
{
public:
string m_name;
int m_id;
static int s_counter;
//--- конструкторы и деструкторы
Foo(void){Setup("noname");};
Foo(string name){Setup(name);};
~Foo(void){};
//--- инициализируем объект Foo
void Setup(string name)
{
m_name=name;
s_counter++;
m_id=s_counter;
}
};
int Foo::s_counter=0;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- объявим объект как переменную с автоматическим созданием
Foo foo1;
//--- вариант передачи объекта по ссылке
PrintObject(foo1);

//--- объявим указатель на объект и создадим его с помощью оператора 'new'
Foo *foo2=new Foo("foo2");
//--- вариант передачи указателя на объект по ссылке
PrintObject(foo2); // указатель на объект автоматически преобразуется компилятором

//--- объявим массив объектов Foo
Foo foo_objects[5];
//--- вариант передачи массива объектов
PrintObjectsArray(foo_objects); // отдельная функция для передачи массива объектов

//--- объявим массив указателей на объекты типа Foo
Foo *foo_pointers[5];
for(int i=0;i<5;i++)
{
foo_pointers[i]=new Foo("foo_pointer");
}
//--- вариант передачи массива указателей
PrintPointersArray(foo_pointers); // отдельная функция для передачи массива указателей

//--- перед завершением работы обязательно удаляем объекты, созданные как указатели
delete(foo2);
//--- удаляем массив указателей
int size=ArraySize(foo_pointers);
for(int i=0;i<5;i++)
delete(foo_pointers[i]);
//---
}
//+------------------------------------------------------------------+
//| Объекты всегда передаются по ссылке |
//+------------------------------------------------------------------+
void PrintObject(Foo &object)
{
Print(__FUNCTION__,": ",object.m_id," Object name=",object.m_name);
}
//+------------------------------------------------------------------+
//| Передача массива объектов |
//+------------------------------------------------------------------+
void PrintObjectsArray(Foo &objects[])
{
int size=ArraySize(objects);
for(int i=0;i<size;i++)
{
PrintObject(objects[i]);
}
}
//+------------------------------------------------------------------+
//| Передача массива указателей на объект |
//+------------------------------------------------------------------+
void PrintPointersArray(Foo* &objects[])
{
int size=ArraySize(objects);
for(int i=0;i<size;i++)
{
PrintObject(objects[i]);
}
}
//+------------------------------------------------------------------+

Смотри также

Переменные, Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Ссылки. Модификатор & и ключевое слово this

Справочник MQL4 / Основы языка / Типы данных / Ссылки. Модификатор & и ключевое слово this

Ссылки. Модификатор & и ключевое слово this

Передача параметров по ссылке

В MQL4 параметры простых типов можно передавать как по значению, так и по ссылке, в то время как параметры сложных типов всегда передаются по ссылке. Для указания компилятору на необходимость передачи параметра по ссылке, перед именем параметра ставится знак амперсанда &.

Передача параметра по ссылке означает передачу адреса переменной, поэтому все изменения, произведенные над переданным по ссылке параметром, сразу же отобразятся и в исходной переменной. Используя передачу параметров по ссылке можно организовать возврат одновременно нескольких результатов из функции. Чтобы предотвратить изменение переданного по ссылке параметра, необходимо использовать модификатор const.

Таким образом, если входной параметр функции является массивом, объектом структуры или класса, то в заголовке функции после типа переменной и перед ее именем ставится символ '&'.

Пример

class CDemoClass
{
private:
double m_array[];

public:
void setArray(double &array[]);
};
//+------------------------------------------------------------------+
//| заполнение массива |
//+------------------------------------------------------------------+
void CDemoClass::setArray(double &array[])
{
if(ArraySize(array)>0)
{
ArrayResize(m_array,ArraySize(array));
ArrayCopy(m_array, array);
}
}

В вышеприведенном примере объявлен класс CDemoClass, который содержит приватный член - массив m_array[] типа double. Объявлена функция setArray(), в которую по ссылке передается массив array[]. Если заголовок функции написать без указания передачи по ссылке, т.е. убрать знак амперсанда, то при попытке компиляции такого кода будет выдано сообщение об ошибке.

Несмотря на то, что массив передается по ссылке, мы не можем произвести присвоение одного массива другому. Необходимо сделать поэлементное копирование содержимого массива-источника в массив-приемник. Наличие символа & для массивов и структур при передаче в качестве параметра функции является обязательным при описании функции.

Ключевое слово this

Переменная типа класса (объект) может передаваться как по ссылке, так и по указателю. Указатель как и ссылка служит для того чтобы получать доступ к объекту. После объявления указателя объекта необходимо применить к нему оператор new для его создания и инициализации.

Зарезервированное слово this предназначено для получения ссылки объекта на самого себя, доступной внутри методов класса или структуры. this всегда ссылается на объект, в методе которого используется, а выражение GetPointer(this) даёт указатель объекта, членом которого является функция, в которой осуществлен вызов функции GetPointer(). В MQL4 функции не могут возвращать объекты, но разрешено возвращать указатель объекта.

Таким образом, если необходимо, чтобы функция вернула объект, то мы можем вернуть указатель этого объекта в виде GetPointer(this). Добавим в описание класса CDemoClass функцию getDemoClass(), которая возвращает указатель объекта этого класса.

class CDemoClass
{
private:
double m_array[];

public:
void setArray(double &array[]);
CDemoClass *getDemoClass();
};
//+------------------------------------------------------------------+
//| заполнение массива |
//+------------------------------------------------------------------+
void CDemoClass::setArray(double &array[])
{
if(ArraySize(array)>0)
{
ArrayResize(m_array,ArraySize(array));
ArrayCopy(m_array,array);
}
}
//+------------------------------------------------------------------+
//| возвращает собственный указатель |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
{
return(GetPointer(this));
}

Структуры не имеют указателей, к ним нельзя применять операторы new и delete, и нельзя использовать GetPointer(this).

Смотри также

Указатели объектов, Создание и уничтожение объектов, Область видимости и время жизни переменных


Операции и выражения

Справочник MQL4 / Основы языка / Операции и выражения

Операции и выражения

Некоторым символам и символьным последовательностям придается особое значение. Это - так называемые символы операций, например:

+ - * / % символы арифметических операций
&& || символы логических операций
= += *= символы операций присваивания

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

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

В данном разделе рассматриваются следующие темы:

  • Выражения
  • Арифметические операции
  • Операции присваивания
  • Операции отношения
  • Логические операции
  • Побитовые операции
  • Другие операции
  • Приоритеты и порядок операций


Выражения

Справочник MQL4 / Основы языка / Операции и выражения / Выражения

Выражения

Выражение состоит из одного или нескольких операндов и символов операций. Может записываться в несколько строк.

Примеры:

a++; b = 10; // несколько выражений расположены на одной строчке
//--- одно выражение разбито на несколько строк
x = (y * z) /
(w + 2) + 127;

Выражение, заканчивающееся точкой с запятой (;), является оператором.

Смотри также

Приоритеты и порядок операций


Арифметические операции

Справочник MQL4 / Основы языка / Операции и выражения / Арифметические операции

Арифметические операции

К арифметическим относятся аддитивные и мультипликативные операции:

Сумма величин i = j + 2;
Вычитание величин i = j - 3;
Изменение знака x = - x;
Умножение величин z = 3 * x;
Частное от деления i = j / 5;
Остаток от деления minutes = time % 60;
Добавление 1 к значению переменной i++;
Добавление 1 к значению переменной ++i;
Вычитание 1 от значения переменной k--;
Вычитание 1 от значения переменной --k;

Операция инкремента и декремента применяются только к переменным, к константам не применяются. Префиксныe инкремент (++i) и декремент (--k) применяются к переменной непосредственно перед использованием этой переменной в выражении.

Постфиксные инкремент (i++) и декремент (k--) применяются к переменной сразу после использования этой переменной в выражении.

Важное замечание

int i=5;
int k = i++ + ++i;

Могут возникнуть вычислительные проблемы при переносе вышеуказанного выражения из одной среды программирования в другую (например, из Borland C++ в MQL4). В общем случае порядок вычислений зависит от реализации компилятора. На практике существуют два способа реализации постдекремента (постинкремента):

  1. постдекремент (постинкремент) применяется к переменной после вычисления всего выражения;
  2. постдекремент (постинкремента) применяется к переменной сразу по месту операции.

В MQL4 в данный момент реализован первый способ вычисления постдекремента (постинкремента). Но даже обладая этим знанием лучше не экспериментировать с использованием данной тонкости.

Примеры:

int a=3;
a++; // верное выражение
int b=(a++)*3; // неверное выражение

Смотри также

Приоритеты и порядок операций


Операции присваивания

Справочник MQL4 / Основы языка / Операции и выражения / Операции присваивания

Операции присваивания

Значением выражения, в которое входит операция присваивания, является значение левого операнда после присваивания:

Присваивание значения x переменной y у = x;

Следующие операции объединяют арифметические или побитовые операции с операцией присваивания:

Увеличение значения переменной у на x у += x;
Уменьшение значения переменной y на x y -= x;
Умножение значения переменной y на x y *= x;
Деление значения переменной y на x y /= x;
Остаток от деления значения переменной y на x y %= x;
Сдвиг двоичного представления y вправо на x бит y >>= x;
Сдвиг двоичного представления y влево на x бит y <<= x;
Побитовая операция И двоичных представлений y и x y &= x;
Побитовая операция ИЛИ двоичных представлений y и x y |= x;
Побитовая операция исключающее ИЛИ
двоичных представлений y и x y ^= x;

Побитовые операции производятся только с целыми числами. При выполнении операции логический сдвиг представления y вправо/влево на x бит используются младшие 5 двоичных разрядов значения x, старшие разряды отбрасываются, то есть сдвиг производится на 0-31 бит.

При выполнении операции %= (значение y по модулю x) знак результата совпадает со знаком делимого.

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

y=x=3;

Сначала переменной x будет присвоено значение 3, затем переменной y будет присвоено значение переменной x, то есть тоже 3.

Смотри также

Приоритеты и порядок операций


Операции отношения

Справочник MQL4 / Основы языка / Операции и выражения / Операции отношения

Операции отношения

Логическое значение ЛОЖЬ представляется целым нулевым значением, а значение ИСТИНА представляется любым ненулевым.

Значением выражений, содержащих операции отношения или логические операции, являются ЛОЖЬ(0) или ИСТИНА(1).

Истина, если a равно b a == b;
Истина, если a не равно b a != b;
Истина, если a меньше b a < b;
Истина, если a больше b a > b;
Истина, если a меньше или равно b a <= b;
Истина, если a больше или равно b a >= b;

Нельзя сравнивать два вещественных числа на равенство друг другу. В большинстве случаев два вроде бы одинаковых числа могут оказаться неравными из-за разницы значения в 15-ом знаке после запятой. Для корректного сравнения двух вещественных чисел необходимо сравнивать нормализованную разницу этих чисел с нулевым значением.

Пример:

bool CompareDoubles(double number1,double number2)
{
if(NormalizeDouble(number1-number2,8)==0) return(true);
else return(false);
}
void OnStart()
{
double first=0.3;
double second=3.0;
double third=second-2.7;
if(first!=third)
{
if(CompareDoubles(first,third))
printf("%.16f %.16f все таки равны",first,third);
}
}
// Результат: 0.3000000000000000 0.2999999999999998 все таки равны

Смотри также

Приоритеты и порядок операций


Логические операции

Справочник MQL4 / Основы языка / Операции и выражения / Логические операции

Логические операции

Логическое отрицание НЕ(!)

Операнд операции логического отрицания НЕ(!) должен иметь арифметический тип. Результат равен ИСТИНА(1), если значение операнда есть ЛОЖЬ(0), и равен ЛОЖЬ(0), если операнд не равен ЛОЖЬ(0).

if(!a) Print("не 'a'");

Логическая операция ИЛИ (||)

Логическая операция ИЛИ (||) значений x и y. Значением выражения является ИСТИНА(1), если истинно (не нуль) значение x или y. В противном случае - ЛОЖЬ(0).

if(x<0 || x>=max_bars) Print("out of range");

Логическая операция И (&&)

Логическая операция И (&&) значений x и y. Значением выражения является ИСТИНА(1), если значения x и y истинны (не нуль). В противном случае - ЛОЖЬ(0).

Короткая оценка логических операций

К логическим выражениям применяется схема так называемой "короткой оценки", то есть, вычисление выражения прекращается в тот момент, когда можно точно оценить результат выражения.

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- первый пример короткой оценки
if(func_false() && func_true())
{
Print("Операция &&: Это сообщение вы никогда не увидите");
}
else
{
Print("Операция &&: Результат первого выражения false, поэтому второе выражение не вычислялось");
}
//--- второй пример короткой оценки
if(!func_false() || !func_true())
{
Print("Операция ||: Результат первого выражения true, поэтому второе выражение не вычислялось");
}
else
{
Print("Операция ||: Это сообщение вы никогда не увидите");
}
}
//+------------------------------------------------------------------+
//| функция всегда возвращает false |
//+------------------------------------------------------------------+
bool func_false()
{
Print("Функция func_false()");
return(false);
}
//+------------------------------------------------------------------+
//| функция всегда возвращает true |
//+------------------------------------------------------------------+
bool func_true()
{
Print("Функция func_true()");
return(true);
}

Смотри также

Приоритеты и порядок операций


Побитовые операции

Справочник MQL4 / Основы языка / Операции и выражения / Побитовые операции

Побитовые операции

Дополнение до единицы

Дополнение до единицы значения переменной. Значение выражения содержит 1 во всех разрядах, в которых значение переменной содержит 0, и 0 во всех разрядах, в которых значения переменной содержит 1.

b = ~n;

Пример:

char a='a',b;
b=~a;
Print("a = ",a, " b = ",b);
// Результат будет такой:
// a= 97 b= -98

Сдвиг вправо

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

Если же сдвигаемое значение имеет знаковый тип, то осуществляется арифметический сдвиг вправо, то есть освобождающиеся слева разряды будут заполняться значением знакового бита (если число положительное, то значение знакового бита равно 0, если число отрицательное, то значение знакового бита равно 1)

x = x >> y;

Пример:

char a='a',b='b';
Print("Before: a = ",a, " b = ",b);
//--- произведем сдвиг вправо
b=a>>1;
Print("After: a = ",a, " b = ",b);
// Результат будет такой:
// Before: a = 97 b = 98
// After: a = 97 b = 48

Сдвиг влево

Двоичное представление x сдвигается влево на y разрядов; освобождающиеся справа разряды заполняются нулями.

x = x << y;

Пример:

char a='a',b='b';
Print("Before: a = ",a, " b = ",b);
//--- произведем сдвиг влево
b=a<<1;
Print("After: a = ",a, " b = ",b);
// Результат будет такой:
// Before: a = 97 b = 98
// After: a = 97 b = -62

Не рекомендуется производить сдвиг на большее или равное число битов, чем разрядность сдвигаемой переменной, так как результат такой операции не определен.

При выполнении операции сдвига над 32-х битными типами для вычисления сдвига учитываются только младшие 5 бит, а для операций сдвига над 64-х битными типами значения сдвига определяется только младшими 6 битами. Покажем это на примере:

int a=305; // тип int имеет размер 4 байта и является 32-х битными число
int b=a; // сделаем копию
int shift=37; // зададим переменную сдвига
shift++; // увеличим значения на 1, shift=38
//--- задаем сдвиг на 38 разрядов, но на самом деле будет произведен сдвиг на 6 разрядов
a=a>>shift; // 38 в двоичном представлении будет выглядеть как '100110', младшие 5 бит '00110' представляют число 6
b=b>>6; // над переменной b произведен сдвиг на 6 разрядов
//--- убедимся, что переменные a и b содержат одинаковое значение после операции сдвига
Print("a = ", a, " b = ", b);

Побитовая операция И

Побитовая операция И двоичных представлений x и y. Значение выражения содержит 1 (ИСТИНА) во всех разрядах, в которых и x, и y содержат не ноль; и 0 (ЛОЖЬ) во всех остальных разрядах.

b = ((x & y) != 0);

Пример:

char a='a',b='b';
//--- операция И
char c=a&b;
Print("a = ",a," b = ",b);
Print("a & b = ",c);
// Результат будет такой:
// a = 97 b = 98
// a & b = 96

Побитовая операция ИЛИ

Побитовая операция ИЛИ двоичных представлений x и y. Значение выражения содержит 1 во всех разрядах, в которых x или y не содержит 0, и 0 - во всех остальных разрядах.

b = x | y;

Пример:

char a='a',b='b';
//--- операция ИЛИ
char c=a|b;
Print("a = ",a," b = ",b);
Print("a | b = ",c);
// Результат будет такой:
// a = 97 b = 98
// a | b = 99

Побитовая операция исключающее ИЛИ

Побитовая операция исключающее ИЛИ (eXclusive OR) двоичных представлений x и y. Значение выражения содержит 1 в тех разрядах, в которых x и y имеют разные двоичные значения, и 0 - во всех остальных разрядах.

b = x ^ y;

Пример:

char a='a', b='b';
//--- операция исключающее ИЛИ
char c=a^b;
Print("a = ",a," b = ",b);
Print("a ^ b = ",c);
// Результат будет такой:
// a = 97 b = 98
// a ^ b = 3

Побитовые операции выполняются только с целыми числами.

Смотри также

Приоритеты и порядок операций


Другие операции

Справочник MQL4 / Основы языка / Операции и выражения / Другие операции

Другие операции

Индексирование ( [] )

При обращении к i-му элементу массива значением выражения является значение переменной с порядковым номером i.

Пример:

array[i] = 3; // Присвоить значение 3 i-му элементу массива array.

Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Индексация каждого измерения производится от 0 до размер измерения-1. В частном случае одномерного массива из 50 элементов обращение к первому элементу будет выглядеть как array[0], к последнему элементу - array[49].

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

Вызов функции с аргументами x1, x2,..., xn

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

Значением выражения является значение, возвращаемое функцией. Если тип возвращаемого значения функции есть void, то вызов такой функции нельзя помещать справа в операции присвоения. Обратите внимание, что порядок выполнения выражений x1,..., xn гарантируется.

Пример:

int length=1000000;
string a="a",b="b",c;
//---
int start=GetTickCount(),stop;
long i;
for(i=0;i<length;i++)
{
c=a+b;
}
stop=GetTickCount();
Print("time for 'c = a + b' = ",(stop-start)," milliseconds, i = ",i);

Операция запятая ( , )

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

Пример:

for(i=0,j=99; i<100; i++,j--) Print(array[i][j]);

Операция точка ( . )

Для прямого доступа к публичным членам структур и классов используется операция точка. Синтаксис

Имя_переменной_типа_структуры.Имя_члена

Пример:

struct SessionTime
{
string sessionName;
int startHour;
int startMinutes;
int endHour;
int endMinutes;
} st;
st.sessionName="Asian";
st.startHour=0;
st.startMinutes=0;
st.endHour=9;
st.endMinutes=0;

Операция разрешения контекста ( :: )

Каждая функция в mql4-программе имеет свой контекст исполнения. Например, системная функция Print() выполняется в глобальном контексте. Импортируемые функции вызываются в контексте соответствующего импорта. Функции-методы классов имеют контекст соответствующего класса. Синтаксис операции разрешения контекста:

[Имя_контекста]::Имя_функции(параметры)

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

Также операция разрешения контекста используется для определения функции-члена класса.

тип Имя_класса::Имя_функции(описание_параметров)
{
// тело функции
}

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

  1. Методы класса. Если функция с заданным именем в классе не задана, то ищем на следующем уровне.
  2. Функции MQL4. Если такой функции в языке нет, то ищем на следующем уровне.
  3. Глобальные функции, определенные пользователем. Если такой функции нет, то ищем на следующем уровне.
  4. Импортируемые функции. Если функция не найдена среди импортируемых, то компилятор выдает ошибку.

Для устранения неоднозначности вызова функций явно указывайте область видимости с помощью операции разрешения контекста.

Пример:

#property script_show_inputs
#import"kernel32.dll"
int GetLastError(void);
#import

class CCheckContext
{
int m_id;
public:
CCheckContext() { m_id=1234; }
protected:
int GetLastError() { return(m_id); }
};
class CCheckContext2 : public CCheckContext
{
int m_id2;
public:
CCheckContext2() { m_id2=5678; }
void Print();
protected:
int GetLastError() { return(m_id2); }
};
void CCheckContext2::Print()
{
::Print("Terminal GetLastError",::GetLastError());
::Print("kernel32 GetLastError",kernel32::GetLastError());
::Print("parent GetLastError",CCheckContext::GetLastError());
::Print("our GetLastError",GetLastError());
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
CCheckContext2 test;
test.Print();
}
//+------------------------------------------------------------------+

Операция взятия размера типа данных или размера объекта любого типа данных ( sizeof )

С помощью операции sizeof можно определить размер памяти которая соответствует идентификатору или типу. Операция sizeof имеет следующий формат:

Пример:

sizeof(выражение)

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

Если в качестве выражения указано имя статического массива (то есть, задана первая размерность), то результатом является размер всего массива (т.е. произведение числа элементов на длину типа). Если в качестве выражения указано имя динамического массива (первая размерность не задана), то результатом будет размер объекта динамического массива.

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

Пример:

struct myStruct
{
char h;
int b;
double f;
} str;
Print("sizeof(str) =",sizeof(str));
Print("sizeof(myStruct) =",sizeof(myStruct));

Вычисления размера происходит на этапе компиляции.

Смотри также

Приоритеты и порядок операций


Приоритеты и порядок операций

Справочник MQL4 / Основы языка / Операции и выражения / Приоритеты и порядок операций

Приоритеты и порядок операций

Для каждой группы операций в таблице приоритет одинаков. Чем выше приоритет группы операций, тем выше она расположена в таблице. Порядок выполнения определяет группировку операций и операндов.

Внимание: Приоритет выполнения операций в языке MQL4 соответствует приоритету, принятому в языке С++.

Операция | Описание | Порядок выполнения
() [] . | Вызов функции Выделение элемента массива Выделение элемента структуры | Слева направо
! ~ – ++ -- (тип) sizeof | Логическое отрицание Побитовое отрицание (complement) Изменение знака Увеличение на единицу (increment) Уменьшение на единицу (decrement) Преобразование типа Определение размера в байтах | Справа налево
* / % | Умножение Деление Деление по модулю | Слева направо
+ – | Сложение Вычитание | Слева направо
<< >> | Сдвиг влево Сдвиг вправо | Слева направо
< <= > >= | Меньше, чем Меньше или равно Больше, чем Больше или равно | Слева направо
== != | Равно Не равно | Слева направо
& | Побитовая операция И | Слева направо
^ | Побитовая операция исключающее ИЛИ (eXclude OR) | Слева направо
| | Побитовая операция ИЛИ | Слева направо
&& | Логическая операция И | Слева направо
|| | Логическая операция ИЛИ | Слева направо
?: | Условная операция | Справа налево
= *= /= %= += -= <<= >>= &= ^= |= | Присваивание Умножение с присваиванием Деление с присваиванием Деление по модулю с присваиванием Сложение с присваиванием Вычитание с присваиванием Сдвиг влево с присваиванием Сдвиг вправо с присваиванием Побитовое И с присваиванием Исключающее ИЛИ с присваиванием Побитовое ИЛИ с присваиванием | Справа налево
, | Запятая | Слева направо

Для изменения порядка выполнения операций применяются круглые скобки, которые имеют высший приоритет.

Приоритеты и порядок операций в старой версии языка MQL4

Ниже для справки приведены приоритеты и порядок операций языка MQL4 до обновления.

Для каждой группы операций в таблице приоритет одинаков. Чем выше приоритет группы операций, тем выше она расположена в таблице. Порядок выполнения определяет группировку операций и операндов.

Операция | Описание | Порядок выполнения
() [] | Вызов функции Выделение элемента массива | Слева направо
! - ++ -- ~ | Логическое отрицание Изменение знака Увеличение на единицу (increment) Уменьшение на единицу (decrement) Побитовое отрицание (complement) | Справа налево
& | ^ << >> | Побитовая операция И Побитовая операция ИЛИ Побитовая операция исключающее ИЛИ (eXclude OR) Сдвиг влево Сдвиг вправо | Слева направо
* / % | Умножение Деление Деление по модулю | Слева направо
+ - | Сложение Вычитание | Слева направо
< <= > >= == != | Меньше, чем Меньше или равно Больше, чем Больше или равно Равно Не равно | Слева направо
|| | Логическая операция ИЛИ | Слева направо
&& | Логическая операция И | Слева направо
= += -= *= /= %= >>= <<= &= |= ^= | Присваивание Сложение с присваиванием Вычитание с присваиванием Умножение с присваиванием Деление с присваиванием Деление по модулю с присваиванием Сдвиг вправо с присваиванием Сдвиг влево с присваиванием Побитовое И с присваиванием Побитовое ИЛИ с присваиванием Исключающее ИЛИ с присваиванием | Справа налево
, | Запятая | Слева направо

Для изменения порядка выполнения операций применяются круглые скобки, которые имеют высший приоритет.

Внимание: Приоритет выполнения операций в старой версии языка MQL4 несколько отличается от приоритета, принятого в языке Си.


Операторы

Справочник MQL4 / Основы языка / Операторы

Операторы

Операторы языка описывают некоторые алгоритмические действия, которые необходимо выполнить для решения задачи. Тело программы — это последовательность таких операторов. Идущие друг за другом операторы разделяются точкой с запятой.

Оператор | Описание
Составной оператор {} | Один или более операторов любого типа, заключенные в фигурные скобки { }
Оператор-выражение (;) | Любое выражение, заканчивающееся точкой с запятой (;)
Оператор return | Прекращает выполнение текущей функции и возвращает управление вызвавшей программе
Условный оператор if-else | Используется при необходимости сделать выбор
Условный оператор ?: | Более простой аналог условного оператора if-else
Оператор выбора switch | Передает управление оператору, который соответствует значению выражения
Оператор цикла while | Выполняет оператор до тех пор, пока проверяемое выражение не станет ложным. Проверка выражения производится перед каждой итерацией
Оператор цикла for | Выполняет оператор до тех пор, пока проверяемое выражение не станет ложным. Проверка выражения производится перед каждой итерацией
Оператор цикла do-while | Выполняет оператор до тех пор, пока проверяемое выражение не станет ложным. Проверка условия окончания производится в конце, после каждого прохода цикла. Тело цикла всегда выполняется по крайней мере один раз.
Оператор break | Прекращает выполнение ближайшего вложенного внешнего оператора switch, while, do-while или for
Оператор continue | Передает управление в начало ближайшего внешнего оператора цикла while, do-while или for
Оператор new | Создает объект соответствующего размера и возвращает описатель созданного объекта.
Оператор delete | Удаляет созданный оператором new объект

Один оператор может занимать одну или более строк. Два или большее количество операторов могут быть расположены на одной строке. Операторы, управляющие порядком выполнения (if, if-else, switch, while и for), могут быть вложены друг в друга.

Пример:

if(Month() == 12)
if(Day() == 31) Print("Happy New Year!");

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Составной оператор

Справочник MQL4 / Основы языка / Операторы / Составной оператор

Составной оператор

Составной оператор (блок) состоит из одного или большего числа операторов любого типа, заключенных в фигурные скобки { }. После закрывающейся фигурной скобки не должно быть точки с запятой (;).

Пример:

if(x==0)
{
Print("invalid position x = ",x);
return;
}

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Оператор-выражение

Справочник MQL4 / Основы языка / Операторы / Оператор-выражение

Оператор-выражение

Любое выражение, заканчивающееся точкой с запятой (;), является оператором. Далее следуют примеры операторов-выражений.

Оператор присваивания:

Идентификатор = выражение;

x=3;
y=x=3;
bool equal=(x==y);

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

Оператор вызова функции:

Имя_функции (аргумент1,..., аргументN);

FileClose(file);

Пустой оператор

Состоит только из точки с запятой (;) и используется для обозначения пустого тела управляющего оператора.

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Оператор возврата return

Справочник MQL4 / Основы языка / Операторы / Оператор возврата return

Оператор возврата return

Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе. Результат вычисления выражения возвращается вызываемой функции. Выражение может содержать оператор присваивания.

Пример:

int CalcSum(int x, int y)
{
return(x+y);
}

В функциях с типом возвращаемого значения void необходимо использовать оператор return без выражения:

void SomeFunction()
{
Print("Hello!");
return; // этот оператор можно удалить
}

Завершающая фигурная скобка функции предполагает неявное исполнение оператора return без выражения.

Можно возвращать простые типы, простые структуры, указатели объектов. При помощи оператора return нельзя возвращать любые массивы, объекты классов, переменные типа сложных структур.

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Условный оператор if-else

Справочник MQL4 / Основы языка / Операторы / Условный оператор if-else

Условный оператор if-else

Оператор IF - ELSE используется при необходимости сделать выбор. Формально синтаксис имеет вид:

if (выражение)
оператор1
else
оператор2

Если выражение истинно, то выполняется оператор1 и управление передается на оператор, следующий за оператором2 (т.е. оператор2 не выполняется). Если выражение ложно, то выполняется оператор2.

Часть else оператора if может опускаться. Поэтому во вложенных операторах if с пропущенной частью else может возникнуть неоднозначность. В этом случае else связывается с ближайшим предыдущим оператором if в том же блоке, не имеющим части else.

Примеры:

//--- Часть else относится ко второму оператору if:
if(x>1)
if(y==2) z=5;
else z=6;
//--- Часть else относится к первому оператору if
if(x>l)
{
if(y==2) z=5;
}
else z=6;
//--- Вложенные операторы
if(x=='a')
{
y=1;
}
else if(x=='b')
{
y=2;
z=3;
}
else if(x=='c')
{
y=4;
}
else Print("ERROR");

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Условный оператор ?:

Справочник MQL4 / Основы языка / Операторы / Условный оператор ?:

Условный оператор ?:

Общая форма тернарного оператора выглядит так:

выражение1 ? выражение2 : выражение3

В качестве первого операнда – "выражение1" – может быть использовано любое выражение, результатом которого является значение типа bool. Если результат равен true, то выполняется оператор, заданный вторым операндом, то есть, "выражение2".

Если же первый операнд paвен false, то выполняется третий операнд – "выражениеЗ". Второй и третий операнды, то есть "выражение2" и "выражениеЗ", должны возвращать значения одного типа и не должны иметь тип void. Результатом выполнения условного оператора является результат "выражения2" либо результат "выражение3", в зависимости от результата "выражение1".

//--- пронормируем разность между ценами открытия и закрытия на дневной размах
double true_range = (High==Low)?0:(Close-Open)/(High-Low);

Эта запись эквивалентна следующей

double true_range;
if(High==Low)true_range=0; // если High и Low равны
else true_range=(Close-Open)/(High-Low); // если размах ненулевой

Ограничения по использованию оператора

Оператор на основании значения "выражение1" должен вернуть одно из двух значений - либо "выражение2", либо "выражение3". Существует ряд ограничений на эти выражения:

  1. Нельзя смешивать пользовательский тип с простым типом или перечислением. Для указателя допустимо использовать NULL.
  2. Если типы значений простые, то типом оператора будет максимальный тип (смотри Приведение типов).
  3. Если одно из значений имеет тип перечисление, а второе является числовым типом, то перечисление заменяется на int и действует второе правило.
  4. Если оба значения являются значениями перечислений, то их типы должны быть одинаковыми, и типом оператора будет перечисление.

Ограничения для пользовательских типов (классов или структур):

  1. типы должны быть одинаковыми или один должен наследоваться от другого.
  2. если типы не одинаковы (наследование), то потомок неявно приводится к родителю, то есть типом оператора будет тип родителя.
  3. нельзя смешивать объект и указатель – либо оба выражения являются объектами, либо указателями. Для указателя допустимо использовать NULL.

Примечание

Будьте внимательны при использовании условного оператора в качестве аргумента перегруженной функции, так как тип результата условного оператора определяется на момент компиляции программы. И этот тип определяется как больший тип из типов "выражение2" и "выражение3".

Пример:

void func(double d) { Print("double argument: ",d); }
void func(string s) { Print("string argument: ",s); }

bool Expression1=true;
double Expression2=M_PI;
string Expression3="3.1415926";

void OnStart()
{
func(Expression2);
func(Expression3);

func(Expression1?Expression2:Expression3); // получим предупреждение компилятора о явном приведении к типу string
func(!Expression1?Expression2:Expression3); // получим предупреждение компилятора о явном приведении к типу string
}

// Результат:
// double argument: 3.141592653589793
// string argument: 3.1415926
// string argument: 3.141592653589793
// string argument: 3.1415926

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Оператор-переключатель switch

Справочник MQL4 / Основы языка / Операторы / Оператор-переключатель switch

Оператор-переключатель switch

Сравнивает значение выражения с константами во всех вариантах case и передает управление оператору, который соответствует значению выражения. Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций. Выражение оператора switch должно быть целого типа.

switch(выражение)
{
case константа: операторы
case константа: операторы
...
default: операторы
}

Операторы, связанные с меткой default, выполняются, если ни одна из констант в операторах case не равна значению выражения. Вариант default не обязательно должен быть объявлен и не обязательно должен быть последним. Если ни одна константа не соответствует значению выражения и вариант default отсутствует, то не выполняется никаких действий.

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

Константное выражение вычисляется в период компиляции. Никакие две константы в одном операторе-переключателе не могут иметь одинаковые значения.

Примеры:

//--- первый пример
switch(x)
{
case 'A':
Print("CASE A");
break;
case 'B':
case 'C':
Print("CASE B or C");
break;
default:
Print("NOT A, B or C");
break;
}

//--- второй пример
string res="";
int i=0;
switch(i)
{
case 1:
res=i;break;
default:
res="default";break;
case 2:
res=i;break;
case 3:
res=i;break;
}
Print(res);
/*
Результат
default
*/

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Оператор цикла while

Справочник MQL4 / Основы языка / Операторы / Оператор цикла while

Оператор цикла while

Оператор while состоит из проверяемого выражения и оператора, который должен быть выполнен:

while(выражение)
оператор;

Если выражение истинно, то оператор выполняется до тех пор, пока выражение не станет ложным. Если выражение ложно, то управление передается следующему оператору. Значение выражения определяется до выполнения оператора. Следовательно, если выражение ложно с самого начала, то оператор вообще не выполняется.

Примечание

Если в цикле предполагается обрабатывать большое количество итераций, то рекомендуется проверять факт принудительного завершения программы с помощью функции IsStopped().

Пример:

while(k<n && !IsStopped())
{
y=y*x;
k++;
}

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Оператор цикла for

Справочник MQL4 / Основы языка / Операторы / Оператор цикла for

Оператор цикла for

Оператор for состоит из трех выражений и выполняемого оператора:

for(выражение1; выражение2; выражение3)
оператор;

Выражение1 описывает инициализацию цикла. Выражение2 - проверка условия завершения цикла. Если оно истинно, то выполняется оператор тела цикла for. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации.

Оператор for эквивалентен следующей последовательности операторов:

выражение1;
while(выражение2)
{
оператор;
выражение3;
};

Любое из трех или все три выражения в операторе for могут отсутствовать, однако разделяющие их точки с запятыми (;) опускать нельзя. Если опущено выражение2, то считается, что оно постоянно истинно. Оператор for(;;) представляет собой бесконечный цикл, эквивалентный оператору while(1). Каждое из выражение1 и выражение3 может состоять из нескольких выражений, объединенных оператором запятая ','.

Примечание

Если в цикле предполагается обрабатывать большое количество итераций, то рекомендуется проверять факт принудительного завершения программы с помощью функции IsStopped().

Примеры:

for(x=1;x<=7000; x++)
{
if(IsStopped())
break;
Print(MathPower(x,2));
}
//--- другой пример
for(;!IsStopped();)
{
Print(MathPower(x,2));
x++;
if(x>10) break;
}
//--- третий пример
for(i=0,j=n-l;i<n && !IsStopped();i++,j--) a[i]=a[j];

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Оператор цикла do while

Справочник MQL4 / Основы языка / Операторы / Оператор цикла do while

Оператор цикла do while

Циклы for и while производят проверку окончания в начале, а не в конце цикла. Третий оператор цикла do - while проверяет условие окончания в конце, после каждого прохода цикла. Тело цикла всегда выполняется по крайней мере один раз.

do
оператор;
while(выражение);

Сначала выполняется оператор, затем вычисляется выражение. Если оно истинно, то оператор выполняется снова и т.д. Если выражение становится ложным, цикл заканчивается.

Примечание

Если в цикле предполагается обрабатывать большое количество итераций, то рекомендуется проверять факт принудительного завершения программы с помощью функции IsStopped().

Пример:

//--- вычисление последовательности чисел Фибоначчи
int counterFibonacci=15;
int i=0,first=0,second=1;
int currentFibonacciNumber;
do
{
currentFibonacciNumber=first+second;
Print("i = ",i," currentFibonacciNumber = ",currentFibonacciNumber);
first=second;
second=currentFibonacciNumber;
i++; // без этого оператора получится бесконечный цикл!!
}
while(i<counterFibonacci && !IsStopped());

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Оператор завершения break

Справочник MQL4 / Основы языка / Операторы / Оператор завершения break

Оператор завершения break

Оператор break прекращает выполнение ближайшего вложенного внешнего оператора switch, while, do-while или for. Управление передается оператору, следующему за заканчиваемым. Одно из назначений этого оператора - закончить выполнение цикла при присваивании некоторой переменной определенного значения.

Пример:

//--- поиск первого нулевого элемента
for(i=0;i<array_size;i++)
if(array[i]==0)
break;

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Оператор продолжения continue

Справочник MQL4 / Основы языка / Операторы / Оператор продолжения continue

Оператор продолжения continue

Оператор continue передает управление в начало ближайшего внешнего оператора цикла while, do-while или for, вызывая начало следующей итерации. Этот оператор по действию противоположен оператору break.

Пример:

//--- сумма всех ненулевых элементов
int func(int array[])
{
int array_size=ArraySize(array);
int sum=0;
for(int i=0;i<array_size; i++)
{
if(a[i]==0) continue;
sum+=a[i];
}
return(sum);
}

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Оператор создания объекта new

Справочник MQL4 / Основы языка / Операторы / Оператор создания объекта new

Оператор создания объекта new

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

Оператор new может быть применен только к объектам класса, к структурам он не применим.

Оператор не применяется для создания массивов объектов. Для этого следует использовать функцию ArrayResize().

Пример:

//+------------------------------------------------------------------+
//| Создание фигуры |
//+------------------------------------------------------------------+
void CTetrisField::NewShape()
{
m_ypos=HORZ_BORDER;
//--- случайным образом создаём одну из 7 возможных фигур
int nshape=rand()%7;
switch(nshape)
{
case 0: m_shape=new CTetrisShape1; break;
case 1: m_shape=new CTetrisShape2; break;
case 2: m_shape=new CTetrisShape3; break;
case 3: m_shape=new CTetrisShape4; break;
case 4: m_shape=new CTetrisShape5; break;
case 5: m_shape=new CTetrisShape6; break;
case 6: m_shape=new CTetrisShape7; break;
}
//--- отрисовываем
if(m_shape!=NULL)
{
//--- начальные установки
m_shape.SetRightBorder(WIDTH_IN_PIXELS+VERT_BORDER);
m_shape.SetYPos(m_ypos);
m_shape.SetXPos(VERT_BORDER+SHAPE_SIZE*8);
//--- отрисуем
m_shape.Draw();
}
//---
}

Следует отметить, что описатель объекта не является указателем на память.

Объект, созданный с помощью оператора new, должен быть явно уничтожен оператором delete.

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Оператор уничтожения объекта delete

Справочник MQL4 / Основы языка / Операторы / Оператор уничтожения объекта delete

Оператор уничтожения объекта delete

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

Пример:

//--- удаляем уложенную фигуру
delete m_shape;
m_shape=NULL;
//--- создаём новую фигуру
NewShape();

Смотри также

Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Функции

Справочник MQL4 / Основы языка / Функции

Функции

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

заголовок_функции
{
инструкции
}

Все, что находится перед первой фигурной скобкой, составляет заголовок определения функции, а то, что находится между фигурными скобками, является телом определения функции. Заголовок функции включает в себя описание типа возвращаемого значения, имени (идентификатора) и формальных параметров. Количество параметров, передаваемых в функцию, ограничено и не может превышать 64.

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

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

Определение функции должно точно соответствовать ее объявлению. Каждая объявленная функция должна быть определена.

Пример:

double // тип возвращаемого значения
linfunc (double a, double b) // имя функции и список параметров
{
// составной оператор
return (a + b); // возвращаемое значение
}

Оператор return может возвращать значение выражения, стоящего в этом операторе. Значение выражения при необходимости преобразуется к типу результата функции. Можно возвращать простые типы, простые структуры, указатели объектов. При помощи оператора return нельзя возвращать любые массивы, объекты классов, переменные типа сложных структур.

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

Пример:

void errmesg(string s)
{
Print("error: "+s);
}

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

Пример:

int somefunc(double a,
double d=0.0001,
int n=5,
bool b=true,
string s="passed string")
{
Print("Обязательный параметр a= ",a);
Print("Переданы следующие параметры: d = ",d," n = ",n," b = ",b," s = ",s);
return(0);
}

Если какому-либо параметру было назначено умолчательное значение, то все последующие параметры также должны иметь умолчательное значение.

Пример неправильного объявления:

int somefunc(double a,
double d=0.0001, // объявлено значение по умолчанию 0.0001
int n, // значение по умолчанию не указано !
bool b, // значение по умолчанию не указано !
string s="passed string")
{
}

Смотри также

Перегрузка, Виртуальные функции, Полиморфизм


Вызов функции

Справочник MQL4 / Основы языка / Функции / Вызов функции

Вызов функции

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

имя_функции (x1, x2,..., xn)

Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок загрузки значений не гарантируются. Во время выполнения производится проверка числа и типа аргументов, переданных функции. Такой способ обращения к функции называется вызовом по значению.

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

Примеры:

int start()
{
double some_array[4]={0.3, 1.4, 2.5, 3.6};
double a=linfunc(some_array, 10.5, 8);
//...
}
double linfunc(double x[], double a, double b)
{
return (a*x[0] + b);
}

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

Примеры:

void somefunc(double init,
double sec=0.0001, //определены значения по умолчанию
int level=10);
//...
somefunc(); // неправильный вызов. первый обязательный параметр должен быть.
somefunc(3.14); // правильный вызов
somefunc(3.14,0.0002); // правильный вызов
somefunc(3.14,0.0002,10); // правильный вызов

При вызове функции нельзя пропускать параметры, даже имеющие умолчательные значения:

somefunc(3.14, , 10); // неправильный вызов -> второй параметр пропущен.

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

Смотри также

Перегрузка, Виртуальные функции, Полиморфизм


Передача параметров

Справочник MQL4 / Основы языка / Функции / Передача параметров

Передача параметров

Существует два метода, с помощью которых машинный язык может передавать аргумент подпрограмме (функции). Первый способ – передача параметра по значению. Этот метод копирует значение аргумента в формальный параметр функции. Поэтому любые изменения этого параметра внутри функции не имеют никакого влияния на соответствующий аргумент вызова.

//+------------------------------------------------------------------+
//| передача параметров по значению |
//+------------------------------------------------------------------+
double FirstMethod(int i,int j)
{
double res;
//---
i*=2;
j/=2;
res=i+j;
//---
return(res);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int a=14,b=8;
Print("a и b перед вызовом:",a," ",b);
double d=FirstMethod(a,b);
Print("a и b после вызова:",a," ",b);
}
//--- результат выполнения скрипта
// a и b перед вызовом: 14 8
// a и b после вызова: 14 8

Второй способ – передача аргумента по ссылке. В этом случае ссылка на параметр (а не его значение) передается параметру функции. Внутри функции она используется для того, чтобы обратиться к фактическому параметру, указанному в вызове. Это означает, что изменения параметра будут влиять на аргумент, использованный для вызова функции.

//+------------------------------------------------------------------+
//| передача параметров по ссылке |
//+------------------------------------------------------------------+
double SecondMethod(int &i,int &j)
{
double res;
//---
i*=2;
j/=2;
res=i+j;
//---
return(res);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int a=14,b=8;
Print("a и b перед вызовом:",a," ",b);
double d=SecondMethod(a,b);
Print("a и b после вызова:",a," ",b);
}
//+------------------------------------------------------------------+
//--- результат выполнения скрипта
// a и b перед вызовом: 14 8
// a и b после вызова: 28 4

MQL4 использует оба метода, за одним исключением: массивы, переменные типа структур и объекты классов всегда передаются по ссылке. Для того чтобы исключить изменения фактических параметров (аргументов, переданных при вызове функции) необходимо использовать спецификатор доступа const. При попытке изменить содержимое переменной, объявленной со спецификатором const, компилятор выдаст ошибку.

Примечание

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

Пример:

void OnStart()
{
//---
int a[]={0,1,2};
int i=0;

func(a[i],a[i++],"Первый вызов (i = "+string(i)+")");
func(a[i++],a[i],"Второй вызов (i = "+string(i)+")");
// Результат:
// Первый вызов(i=0) : par1 = 1 par2 = 0
// Второй вызов(i=1) : par1 = 1 par2 = 1

}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void func(int par1,int par2,string comment)
{
Print(comment,": par1 = ",par1," par2 = ",par2);
}

При первом вызове в приведенном примере сначала переменная i участвует в конкатенации строк:

"Первый вызов (i = "+string(i)+")"

При этом ее значение не меняется. Затем переменная i участвует в вычислении элемента массива a[i++], то есть после взятия i-го элемента массива переменная i инкрементируется. И только после этого вычисляется первый параметр с измененным значением переменной i.

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

Смотри также

Область видимости и время жизни переменных, Перегрузка, Виртуальные функции, Полиморфизм


Перегрузка функций

Справочник MQL4 / Основы языка / Функции / Перегрузка функций

Перегрузка функций

Обычно в названии функции стремятся отобразить ее основное назначение. Читабельные программы, как правило, содержат разнообразные и грамотно подобранные идентификаторы. Иногда различные функции используются для одних и тех же целей. Например, рассмотрим функцию, которая вычисляет среднее значение массива чисел двойной точности, и такую же функцию, но оперирующую массивом целых чисел. И ту, и другую удобно назвать AverageFromArray:

//+------------------------------------------------------------------+
//| вычисление среднего для массива типа double |
//+------------------------------------------------------------------+
double AverageFromArray(const double & array[],int size)
{
if(size<=0) return 0.0;
double sum=0.0;
double aver;
//---
for(int i=0;i<size;i++)
{
sum+=array[i]; // сложение для double
}
aver=sum/size; // просто делим сумму на количество
//---
Print("Вычисление среднего для массива типа double");
return aver;
}
//+------------------------------------------------------------------+
//| вычисление среднего для массива типа int |
//+------------------------------------------------------------------+
double AverageFromArray(const int & array[],int size)
{
if(size<=0) return 0.0;
double aver=0.0;
int sum=0;
//---
for(int i=0;i<size;i++)
{
sum+=array[i]; // сложение для int
}
aver=(double)sum/size;// приведем сумму к типу double и разделим
//---
Print("Вычисление среднего для массива типа int");
return aver;
}

Каждая функция содержит вывод сообщения посредством функции Print();

Print("Вычисление среднего для массива типа int");

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

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int a[5]={1,2,3,4,5};
double b[5]={1.1,2.2,3.3,4.4,5.5};
double int_aver=AverageFromArray(a,5);
double double_aver=AverageFromArray(b,5);
Print("int_aver = ",int_aver," double_aver = ",double_aver);
}
//--- Результат работы скрипта
// Вычисление среднего для массива типа int
// Вычисление среднего для массива типа double
// int_aver= 3.00000000 double_aver= 3.30000000

Перегрузка функций – это создание нескольких функций с одним именем, но с разными параметрами. Это означает, что в перегружаемых вариантах функции разным должно быть количество аргументов и/или их тип. Выбор конкретного варианта функции зависит от типов аргументов, полученных функцией. Конкретная функция выбирается в зависимости от соответствия списка аргументов при вызове функции списку параметров в объявлении функции.

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

Ниже приведен алгоритм соответствия для каждого аргумента.

Алгоритм выбора перегруженной функции

  1. Использовать строгое соответствие (если это возможно).
  2. Попробовать стандартное повышение типа.
  3. Попробовать стандартное преобразование типа.

Стандартное повышение типа лучше, чем остальные стандартные преобразования. Повышение - это преобразование float в double, а также bool, char, short или enum в int. Кроме того, к стандартным преобразованиям относятся преобразования массивов похожих целых типов. Похожими типами являются: bool, char, uchar, так как все три типа являются однобайтовыми целыми; двубайтовые целые short и ushort; 4-байтовые целые int, uint и color; long, ulong и datetime.

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

Если вы сомневаетесь, используйте явные преобразования для обеспечения строгого соответствия.

Примеры перегруженных функций в MQL4 вы можете увидеть на примере функций ArrayInitialize().

Правила перегрузки функций применимы к перегрузке методов классов.

Перегрузка системных функций допускается, но при этом следует следить за тем, чтобы компилятор точно мог выбрать нужную функцию. Для примера, мы можем перегрузить системную функцию MathMax() 4-мя различными способами, но только два варианта будут корректными.

Пример:

// 1. перегрузка допустима - функция отличается от встроенной в язык MathMax() по количеству параметров
double MathMax(double a,double b,double c);

// 2. перегрузка недопустима!
// количество параметров разное, но последний имеет значение по умолчанию
// это приводит к сокрытию системной функции при вызове, что недопустимо
double MathMax(double a,double b,double c=DBL_MIN);

// 3. перегрузка допустима - нормальная перегрузка по типу параметров a и b
int MathMax(int a,int b);

// 4. перегрузка недопустима!
// количество и тип параметров не отличается от исходной double MathMax(double a,double b)
int MathMax(double a,double b);

Смотри также

Перегрузка, Виртуальные функции, Полиморфизм


Перегрузка операций

Справочник MQL4 / Основы языка / Функции / Перегрузка операций

Перегрузка операций

Для удобства чтения и написания кода разрешается перегрузка некоторых операций. Оператор перегрузки записывается с помощью ключевого слова operator. Разрешена перегрузка следующих операций:

  • бинарные +,-,/,*,%,<<,>>,==,!=,<,>,<=,>=,=,+=,-=,/=,*=,%=,&=,|=,^=,<<=,>>=,&&,||,&,|,^;
  • унарные +,-,++,--,!,~;
  • оператор присваивания =;
  • оператор индексации [].

Перегрузка операций позволяет использовать операционную нотацию (запись в виде простых выражений) к сложным объектам - структурам и классам. Запись выражений с использованием перегруженных операций упрощает восприятие исходного кода, так как более сложная реализация сокрыта.

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

//+------------------------------------------------------------------+
//| Структура для операций с комплексными числами |
//+------------------------------------------------------------------+
struct complex
{
double re; // действительная часть
double im; // мнимая часть
//--- конструкторы
complex():re(0.0),im(0.0) { }
complex(const double r):re(r),im(0.0) { }
complex(const double r,const double i):re(r),im(i) { }
complex(const complex &o):re(o.re),im(o.im) { }
//--- арифметические операции
complex Add(const complex &l,const complex &r) const; // сложение
complex Sub(const complex &l,const complex &r) const; // вычитание
complex Mul(const complex &l,const complex &r) const; // умножение
complex Div(const complex &l,const complex &r) const; // деление
};

Теперь мы можем объявлять в своем коде переменные, представляющие комплексные числа, и работать с ними.

Например так:

void OnStart()
{
//--- объявим и инициализируем переменные комплексного типа
complex a(2,4),b(-4,-2);
PrintFormat("a=%.2f+i*%.2f, b=%.2f+i*%.2f",a.re,a.im,b.re,b.im);
//--- сложим два числа
complex z;
z=a.Add(a,b);
PrintFormat("a+b=%.2f+i*%.2f",z.re,z.im);
//--- умножим два числа
z=a.Mul(a,b);
PrintFormat("a*b=%.2f+i*%.2f",z.re,z.im);
//--- разделим два числа
z=a.Div(a,b);
PrintFormat("a/b=%.2f+i*%.2f",z.re,z.im);
//---
}

Но было бы удобнее для привычных арифметических операций с комплексными числами использовать привычные операторы "+","-","*" и "/".

Ключевое слово operator используется для того чтобы определить функцию-член, осуществляющую преобразование типа. Унарные и бинарные операции для переменных-объектов класса могут быть перегружены как нестатические функции-члены. Они неявно действуют на объект класса.

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

//--- операторы
complex operator+(const complex &r) const { return(Add(this,r)); }
complex operator-(const complex &r) const { return(Sub(this,r)); }
complex operator*(const complex &r) const { return(Mul(this,r)); }
complex operator/(const complex &r) const { return(Div(this,r)); }

Полный пример скрипта:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- объявим и инициализируем переменные комплексного типа
complex a(2,4),b(-4,-2);
PrintFormat("a=%.2f+i*%.2f, b=%.2f+i*%.2f",a.re,a.im,b.re,b.im);
//a.re=5;
//a.im=1;
//b.re=-1;
//b.im=-5;
//--- сложим два числа
complex z=a+b;
PrintFormat("a+b=%.2f+i*%.2f",z.re,z.im);
//--- умножим два числа

z=a*b;
PrintFormat("a*b=%.2f+i*%.2f",z.re,z.im);
//--- разделим два числа
z=a/b;
PrintFormat("a/b=%.2f+i*%.2f",z.re,z.im);
//---
}
//+------------------------------------------------------------------+
//| Структура для операций с комплексными числами |
//+------------------------------------------------------------------+
struct complex
{
double re; // действительная часть
double im; // мнимая часть
//--- конструкторы
complex():re(0.0),im(0.0) { }
complex(const double r):re(r),im(0.0) { }
complex(const double r,const double i):re(r),im(i) { }
complex(const complex &o):re(o.re),im(o.im) { }
//--- арифметические операции
complex Add(const complex &l,const complex &r) const; // сложение
complex Sub(const complex &l,const complex &r) const; // вычитание
complex Mul(const complex &l,const complex &r) const; // умножение
complex Div(const complex &l,const complex &r) const; // деление
//--- бинарные операторы
complex operator+(const complex &r) const { return(Add(this,r)); }
complex operator-(const complex &r) const { return(Sub(this,r)); }
complex operator*(const complex &r) const { return(Mul(this,r)); }
complex operator/(const complex &r) const { return(Div(this,r)); }
};
//+------------------------------------------------------------------+
//| Сложение |
//+------------------------------------------------------------------+
complex complex::Add(const complex &l,const complex &r) const
{
complex res;
//---
res.re=l.re+r.re;
res.im=l.im+r.im;
//--- результат
return res;
}
//+------------------------------------------------------------------+
//| Вычитание |
//+------------------------------------------------------------------+
complex complex::Sub(const complex &l,const complex &r) const
{
complex res;
//---
res.re=l.re-r.re;
res.im=l.im-r.im;
//--- результат
return res;
}
//+------------------------------------------------------------------+
//| Умножение |
//+------------------------------------------------------------------+
complex complex::Mul(const complex &l,const complex &r) const
{
complex res;
//---
res.re=l.re*r.re-l.im*r.im;
res.im=l.re*r.im+l.im*r.re;
//--- результат
return res;
}
//+------------------------------------------------------------------+
//| Деление |
//+------------------------------------------------------------------+
complex complex::Div(const complex &l,const complex &r) const
{
//--- пустое комплексное число
complex res(EMPTY_VALUE,EMPTY_VALUE);
//--- проверка на ноль
if(r.re==0 && r.im==0)
{
Print(__FUNCTION__+": number is zero");
return(res);
}
//--- вспомогательные переменные
double e;
double f;
//--- выбор варианта вычисления
if(MathAbs(r.im)<MathAbs(r.re))
{
e = r.im/r.re;
f = r.re+r.im*e;
res.re=(l.re+l.im*e)/f;
res.im=(l.im-l.re*e)/f;
}
else
{
e = r.re/r.im;
f = r.im+r.re*e;
res.re=(l.im+l.re*e)/f;
res.im=(-l.re+l.im*e)/f;
}
//--- результат
return res;
}

Большинство унарных операций для классов можно перегружать как обычные функции, принимающие единственный аргумент-объект класса или указатель на него. Добавим перегрузку унарных операций "-" и "!".

//+------------------------------------------------------------------+
//| Структура для операций с комплексными числами |
//+------------------------------------------------------------------+
struct complex
{
double re; // действительная часть
double im; // мнимая часть
...
//--- унарные операторы
complex operator-() const; // унарный минус
bool operator!() const; // отрицание
};
...
//+------------------------------------------------------------------+
//| Перегрузка оператора "унарный минус" |
//+------------------------------------------------------------------+
complex complex::operator-() const
{
complex res;
//---
res.re=-re;
res.im=-im;
//--- результат
return res;
}
//+------------------------------------------------------------------+
//| Перегрузка оператора "логическое отрицание" |
//+------------------------------------------------------------------+
bool complex::operator!() const
{
//--- действительная и мнимая часть комплексного числа равны нулю?
return (re!=0 && im!=0);
}

Теперь мы можем проверять значение комплексного числа на ноль и получать отрицательное значение:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- объявим и инициализируем переменные комплексного типа
complex a(2,4),b(-4,-2);
PrintFormat("a=%.2f+i*%.2f, b=%.2f+i*%.2f",a.re,a.im,b.re,b.im);
//--- разделим два числа
complex z=a/b;
PrintFormat("a/b=%.2f+i*%.2f",z.re,z.im);
//--- комплексное число по умолчанию равно нулю (в конструкторе по умолчанию re==0 и im==0)
complex zero;
Print("!zero=",!zero);
//--- присвоим отрицательное значение
zero=-z;
PrintFormat("z=%.2f+i*%.2f, zero=%.2f+i*%.2f",z.re,z.im, zero.re,zero.im);
PrintFormat("-zero=%.2f+i*%.2f",-zero.re,-zero.im);
//--- еще раз проверим на равенство нулю
Print("!zero=",!zero);
//---
}

Обратите внимание, что нам не пришлось в данном случае перегружать операцию присваивания "=", так как структуры простых типов можно копировать друг в друга напрямую. Таким образом, теперь мы можем писать код для расчетов с участием комплексных чисел в привычной манере.

Перегрузка оператора индексирования позволяет получать значения массивов, заключенных в объект, более простым и привычным способом, и это также способствует лучшей читаемости и пониманию исходного кода программ. Например, нам необходимо обеспечить доступ к символу в строке по указанной позиции. Строка в языке MQL4 является отдельным типом string, который не является массивом символов, но с помощью перегруженной операции индексации в созданном классе CString мы можем обеспечить простую и прозрачную работу:

//+------------------------------------------------------------------+
//| Класс для доступа к символам в строке как в массиве символов |
//+------------------------------------------------------------------+
class CString
{
string m_string;

public:
CString(string str=NULL):m_string(str) { }
ushort operator[] (int x) { return(StringGetCharacter(m_string,x)); }
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- массив для получения символов из строки
int x[]={ 19,4,18,19,27,14,15,4,17,0,19,14,17,27,26,28,27,5,14,
17,27,2,11,0,18,18,27,29,30,19,17,8,13,6 };
CString str("abcdefghijklmnopqrstuvwxyz[ ]CS");
string res;
//--- составим фразу,набрав символы из переменной str
for(int i=0,n=ArraySize(x);i<n;i++)
{
res+=ShortToString(str[x[i]]);
}
//--- выведем результат
Print(res);
}

Другой пример перегрузки операции индексирования - работа с матрицами. Матрица представляет собою двумерный динамический массив, размеры массивов заранее неопределены. Поэтому нельзя объявить массив вида array[][] без указания размера второго измерения и затем передавать этот массив в качестве параметра. Выходом может служить специальный класс CMatrix, который содержит в себе массив объектов класса CRow.

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- операции сложения и умножения матриц
CMatrix A(3),B(3),C();
//--- готовим массивы под строки
double a1[3]={1,2,3}, a2[3]={2,3,1}, a3[3]={3,1,2};
double b1[3]={3,2,1}, b2[3]={1,3,2}, b3[3]={2,1,3};
//--- заполняем матрицы
A[0]=a1; A[1]=a2; A[2]=a3;
B[0]=b1; B[1]=b2; B[2]=b3;
//--- выведем матрицы в журнал "Эксперты"
Print("---- элементы матрицы A");
Print(A.String());
Print("---- элементы матрицы B");
Print(B.String());

//--- сложение матриц
Print("---- сложение матриц A и B");
C=A+B;
//--- вывод форматированного строкового представления
Print(C.String());

//--- умножение матриц
Print("---- произведение матриц A и B");
C=A*B;
Print(C.String());

//--- а теперь покажем как получать значения в стиле динамических массивов matrix[i][j]
Print("Выводим значения матрицы C поэлементно");
//--- перебираем в цикле строки матрицы - объекты CRow
for(int i=0;i<3;i++)
{
string com="| ";
//--- формируем для значения строки из матрицы
for(int j=0;j<3;j++)
{
//--- получим элемент матрицы по номерам строки и столбца
double element=C[i][j];// [i] - доступ к CRow в массиве m_rows[] ,
// [j] - перегруженный оператор индексации в CRow
com=com+StringFormat("a(%d,%d)=%G ; ",i,j,element);
}
com+="|";
//--- выводим значения строки
Print(com);
}
}
//+------------------------------------------------------------------+
//| Класс "Строка" |
//+------------------------------------------------------------------+
class CRow
{
private:
double m_array[];
public:
//--- конструкторы и деструктор
CRow(void) { ArrayResize(m_array,0); }
CRow(const CRow &r) { this=r; }
CRow(const double &array[]);
~CRow(void){};
//--- количество элементов в строке
int Size(void) const { return(ArraySize(m_array));}
//--- возвращает строку со значениями
string String(void) const;
//--- оператор индексации
double operator[](int i) const { return(m_array[i]); }
//--- операторы присваивания
void operator=(const double &array[]); // массив
void operator=(const CRow & r); // другой объект CRow
double operator*(const CRow &o); // объект CRow для умножения
};
//+------------------------------------------------------------------+
//| Конструктор для инициализации строки массивом |
//+------------------------------------------------------------------+
void CRow::CRow(const double &array[])
{
int size=ArraySize(array);
//--- если массив не пустой
if(size>0)
{
ArrayResize(m_array,size);
//--- заполним значениями
for(int i=0;i<size;i++)
m_array[i]=array[i];
}
//---
}
//+------------------------------------------------------------------+
//| Операция присваивания для массива |
//+------------------------------------------------------------------+
void CRow::operator=(const double &array[])
{
int size=ArraySize(array);
if(size==0) return;
//--- заполняем массив значениями
ArrayResize(m_array,size);
for(int i=0;i<size;i++) m_array[i]=array[i];
//---
}
//+------------------------------------------------------------------+
//| Операция присваивания для СRow |
//+------------------------------------------------------------------+
void CRow::operator=(const CRow &r)
{
int size=r.Size();
if(size==0) return;
//--- заполняем массив значениями
ArrayResize(m_array,size);
for(int i=0;i<size;i++) m_array[i]=r[i];
//---
}
//+------------------------------------------------------------------+
//| Оператор умножения на другую строку |
//+------------------------------------------------------------------+
double CRow::operator*(const CRow &o)
{
double res=0;
//--- проверки
int size=Size();
if(size!=o.Size() || size==0)
{
Print(__FUNCSIG__,": Ошибка умножения двух матриц, не совпадают размеры");
return(res);
}
//--- умножим поэлементно массивы и сложим произведения
for(int i=0;i<size;i++)
res+=m_array[i]*o[i];
//--- результат
return(res);
}
//+------------------------------------------------------------------+
//| Возвращает форматированное строковое представление |
//+------------------------------------------------------------------+
string CRow::String(void) const
{
string out="";
//--- если размер массива больше нуля
int size=ArraySize(m_array);
//--- работаем только при ненулевом кол-ве элементов в массиве
if(size>0)
{
out="{";
for(int i=0;i<size;i++)
{
//--- собираем значения в строку
out+=StringFormat(" %G;",m_array[i]);
}
out+=" }";
}
//--- результат
return(out);
}
//+------------------------------------------------------------------+
//| Класс "Матрица" |
//+------------------------------------------------------------------+
class CMatrix
{
private:
CRow m_rows[];

public:
//--- конструкторы и деструктор
CMatrix(void);
CMatrix(int rows) { ArrayResize(m_rows,rows); }
~CMatrix(void){};
//--- получение размеров матрицы
int Rows() const { return(ArraySize(m_rows)); }
int Cols() const { return(Rows()>0? m_rows[0].Size():0); }
//--- возвращает значения столбца в виде строки CRow
CRow GetColumnAsRow(const int col_index) const;
//--- возвращает строку со значениями матрицы
string String(void) const;
//--- оператор индексации возвращает строку по ее номеру
CRow *operator[](int i) const { return(GetPointer(m_rows[i])); }
//--- оператор сложения
CMatrix operator+(const CMatrix &m);
//--- оператор умножения
CMatrix operator*(const CMatrix &m);
//--- оператор присваивания
CMatrix *operator=(const CMatrix &m);
};
//+------------------------------------------------------------------+
//| Конструктор по умолчанию, создает массив строк нулевого размера |
//+------------------------------------------------------------------+
CMatrix::CMatrix(void)
{
//--- нулевое количество строк в матрице
ArrayResize(m_rows,0);
//---
}
//+------------------------------------------------------------------+
//| Возвращает значения столбца в виде строки CRow |
//+------------------------------------------------------------------+
CRow CMatrix::GetColumnAsRow(const int col_index) const
{
//--- переменная для получения значений из столбца
CRow row();
//--- количество строк в матрице
int rows=Rows();
//--- если количество строк больше нуля, выполняем операцию
if(rows>0)
{
//--- массив для получения значений столбца с индексом col_index
double array[];
ArrayResize(array,rows);
//--- заполнение массива
for(int i=0;i<rows;i++)
{
//--- проверка номера столбца для i-ой строки на выход за пределы массива
if(col_index>=this[i].Size())
{
Print(__FUNCSIG__,": Ошибка! Номер столбца ",col_index,"> размера строки ",i);
break; // row останется неинициализированным объектом
}
array[i]=this[i][col_index];
}
//--- создадим строку CRow на основе значений массива
row=array;
}
//--- результат
return(row);
}
//+------------------------------------------------------------------+
//| Сложение двух матриц |
//+------------------------------------------------------------------+
CMatrix CMatrix::operator+(const CMatrix &m)
{
//--- количество строк и столбцов в переданной матрице
int cols=m.Cols();
int rows=m.Rows();
//--- матрица для получения результата сложения
CMatrix res(rows);
//--- размеры матрицы должны совпадать
if(cols!=Cols() || rows!=Rows())
{
//--- нельзя произвести сложение
Print(__FUNCSIG__,": Ошибка сложения двух матриц, не совпадают размеры");
return(res);
}
//--- вспомогательный массив
double arr[];
ArrayResize(arr,cols);
//--- перебираем строки для сложения
for(int i=0;i<rows;i++)
{
//--- запишем результаты сложений строк матриц в массив
for(int k=0;k<cols;k++)
{
arr[k]=this[i][k]+m[i][k];
}
//--- поместим массив в строку матрицы
res[i]=arr;
}
//--- вернем результат сложения матриц
return(res);
}
//+------------------------------------------------------------------+
//| Умножение двух матриц |
//+------------------------------------------------------------------+
CMatrix CMatrix::operator*(const CMatrix &m)
{
//--- кол-во столбцов первой матрицы кол-во строк в переданной матрице
int cols1=Cols();
int rows2=m.Rows();
int rows1=Rows();
int cols2=m.Cols();
//--- матрица для получения результата сложения
CMatrix res(rows1);
//--- матрицы должны быть согласованы
if(cols1!=rows2)
{
//--- нельзя произвести умножение
Print(__FUNCSIG__,": Ошибка умножения двух матриц, формат не согласован "
"- число столбцов в первом сомножителе должно быть равно числу строк во втором");
return(res);
}
//--- вспомогательный массив
double arr[];
ArrayResize(arr,cols1);
//--- заполняем строки в матрице произведения
for(int i=0;i<rows1;i++)// перебираем строки
{
//--- обнулим массив-приемник
ArrayInitialize(arr,0);
//--- перебираем элементы в строке
for(int k=0;k<cols1;k++)
{
//--- возьмем из матрицы m значения к-го столбца в виде строки Crow
CRow column=m.GetColumnAsRow(k);
//--- перемножим две строки и запишем результат скалярного умножения векторов в i-ый элемент
arr[k]=this[i]*column;
}
//--- поместим массив arr[] в i-ую строку матрицы
res[i]=arr;
}
//--- вернем произведение двух матриц
return(res);
}
//+------------------------------------------------------------------+
//| Операция присваивания |
//+------------------------------------------------------------------+
CMatrix *CMatrix::operator=(const CMatrix &m)
{
//--- узнаем и зададим количество строк
int rows=m.Rows();
ArrayResize(m_rows,rows);
//--- заполним наши строки значениями строк переданной матрицы
for(int i=0;i<rows;i++) this[i]=m[i];
//---
return(GetPointer(this));
}
//+------------------------------------------------------------------+
//| Строковое представление матрицы |
//+------------------------------------------------------------------+
string CMatrix::String(void) const
{
string out="";
int rows=Rows();
//--- формируем построчно
for(int i=0;i<rows;i++)
{
out=out+this[i].String()+"\r\n";
}
//--- результат
return(out);
}

Смотри также

Перегрузка, Арифметические операции, Перегрузка функций, Приоритеты и порядок операций


Описание внешних функций

Справочник MQL4 / Основы языка / Функции / Описание внешних функций

Описание внешних функций

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

Примеры:

#import "user32.dll"
int MessageBoxW(int hWnd ,string szText,string szCaption,int nType);
int SendMessageW(int hWnd,int Msg,int wParam,int lParam);
#import "lib.ex4"
double round(double value);
#import

С помощью импорта можно очень легко описывать функции, вызываемые из внешних DLL или скомпилированных EX4 библиотек. Библиотеками EX4 являются скомпилированные ex4-файлы, которые имеют свойство library. Импортировать из EX4 библиотек можно только функции, описанные с модификатором export.

При совместном использовании DLL и EX4-библиотек следует помнить о том, что библиотеки должны иметь разные имена (вне зависимости от каталогов их размещения). Все импортируемые функции получают область видимости "имя файла" библиотеки.

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

Пример:

#import "kernel32.dll"
int GetLastError();
#import "lib.ex4"
int GetLastError();
#import

class CFoo
{
public:
int GetLastError() { return(12345); }
void func()
{
Print(GetLastError()); // вызов метода класса
Print(::GetLastError()); // вызов функции MQL4
Print(kernel32::GetLastError()); // вызов функции kernel32.dll
Print(lib::GetLastError()); // вызов функции lib.ex4
}
};

void OnStart()
{
CFoo foo;
foo.func();
}

Смотри также

Перегрузка, Виртуальные функции, Полиморфизм


Экспортирование функций

Справочник MQL4 / Основы языка / Функции / Экспортирование функций

Экспортирование функций

Существует возможность использования в mql4-программе функции, объявленной в другой mql4-программе с постмодификатором export. Такая функция называется экспортируемой, и она доступна для вызова из других программ после компиляции.

int Function() export
{
}

Данный модификатор указывает компилятору внести функцию в таблицу EX4-функций, экспортируемых данным исполняемым ex4-файлом. Только функции с таким модификатором становятся доступными ("видимыми") из других mql4-программ.

Свойство library указывает компилятору, что данный EX4-файл будет являться библиотекой, и компилятор проставит это в заголовке EX4.

Все функции, которые планируются как экспортируемые, должны быть помечены модификатором export.

При компиляции библиотек в режиме strict для каждой экспортируемой функции необходимо добавлять модификатор export. в противном случае функция не будет доступна извне.

Смотри также

Перегрузка, Виртуальные функции, Полиморфизм


События

Справочник MQL4 / Основы языка / Функции / Функции обработки событий

Функции обработки событий

В языке MQL4 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL4: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события.

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

OnStart

Функция OnStart() является обработчиком события Start, которое автоматически генерируется только для запущенных на выполнение скриптов. Должна иметь тип void, параметров не имеет:

void OnStart();

Для функции OnStart() допустимо указывать тип возвращаемого значения int.

OnInit

Функция OnInit() является обработчиком события Init. Может иметь тип void или int, параметров не имеет:

void OnInit();

Событие Init генерируется сразу после загрузки эксперта или индикатора. Функция OnInit() используется для инициализации. Если OnInit() имеет возвращаемое значение типа int, то ненулевой код возврата означает неудачную инициализацию и генерирует событие Deinit с кодом причины деинициализации REASON_INITFAILED.

Результат выполнения функции OnInit() анализируется исполняющей подсистемой терминала только в том случае, если программа скомпилирована с использованием #property strict.

Для оптимизации входных параметров эксперта рекомендуется в качестве кода возврата использовать значения из перечисления ENUM_INIT_RETCODE. Эти значения предназначены для организации управления ходом оптимизации. Прямо при инициализации эксперта еще до запуска самого тестирования можно запросить информацию о конфигурации и ресурсах с помощью функции TerminalInfoInteger().

ENUM_INIT_RETCODE

Идентификатор

Описание

INIT_SUCCEEDED

Инициализация прошла успешно, тестирование эксперта можно продолжать.

Этот код означает то же самое, что и нулевое значение – инициализация эксперта в тестере прошла успешно.

INIT_FAILED

Неудачная инициализация, тестирование нет смысла продолжать из-за неустранимых ошибок. Например, не удалось создать индикатор, необходимый для работы эксперта.

Возврат этого значения означает то же самое, что и возврат значения, отличного от нуля – инициализация эксперта в тестере прошла неудачно.

INIT_PARAMETERS_INCORRECT

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

Тестирование для данного набора параметров эксперта не будет выполняться.

Функция OnInit() типа void всегда означает удачную инициализацию.

OnDeinit

Функция OnDeinit() вызывается при деинициализации и является обработчиком события Deinit. Должна быть объявлена с типом void и иметь один параметр типа const int , который содержит код причины деинициализации. Если объявлен иной тип, компилятор выдаст предупреждение, но функция вызываться не будет.

void OnDeinit(const int reason);

Событие Deinit генерируется для экспертов и индикаторов в следующих случаях:

  • перед переинициализацией в связи со сменой символа или периода графика, к которому прикреплена mql4-программа;
  • перед переинициализацией в связи со сменой входных параметров;
  • перед выгрузкой mql4-программы.

OnTick

Событие NewTick генерируется только для экспертов при поступлении нового тика по символу, к графику которого прикреплен эксперт. Функцию OnTick() бесполезно определять в пользовательском индикаторе или скрипте, поскольку событие NewTick для них не генерируется.

Событие Tick генерируется только для экспертов, но это не означает, что эксперты обязаны иметь функцию OnTick(), так как для экспертов генерируются не только события NewTick, но и события Timer, BookEvent и ChartEvent. Должна быть объявлена с типом void, параметров не имеет:

void OnTick();

OnTimer

Функция OnTimer() вызывается при наступлении события Timer, которое генерируется системным таймером только для экспертов и индикаторов – использовать ее в скриптах нельзя. Периодичность наступления этого события устанавливается при подписке на получение функцией EventSetTimer() уведомлений о событии Timer.

Отписывание от приема посылки событий таймера для конкретного эксперта производится функцией EventKillTimer(). Функция должна быть определена с типом void, параметров не имеет:

void OnTimer();

Рекомендуется вызывать функцию EventSetTimer() однократно в функции OnInit(), а функцию EventKillTimer() вызывать однократно в OnDeinit().

Каждый эксперт и каждый индикатор работает со своим таймером, и получает события только от него. При завершении работы mql4-программы таймер уничтожается принудительно, если он был создан, но не был отключен функцией EventKillTimer().

OnTester

Функция OnTester() является обработчиком события Tester, которое автоматически генерируется по окончании исторического тестирования эксперта на заданном интервале дат. Функция должна быть определена с типом double, параметров не имеет:

double OnTester();

Функция вызывается непосредственно перед вызовом функции OnDeinit() и имеет тип возвращаемого значения double. Функция OnTester() может быть использована только в экспертах при тестировании и предназначена в первую очередь для расчета некоторого значения, используемого в качестве критерия Custom max при генетической оптимизации входных параметров.

При генетической оптимизации сортировка результатов в пределах одного поколения производится по убыванию. То есть, лучшими с точки зрения критерия оптимизации считаются результаты с наибольшим значением (для критерия оптимизации Custom max в расчет принимаются значения, возвращенные функцией OnTester). Худшие значения при такой сортировке помещаются в конец и впоследствии отбрасываются и не принимают участия в формировании следующего поколения.

OnChartEvent

OnChartEvent() является обработчиком группы событий ChartEvent:

  • CHARTEVENT_KEYDOWN — событие нажатия клавиатуры, когда окно графика находится в фокусе;
  • CHARTEVENT_MOUSE_MOVE — события перемещения мыши и нажатия кнопок мыши (если для графика установлено свойство CHART_EVENT_MOUSE_MOVE=true);
  • CHARTEVENT_OBJECT_CREATE — событие создания графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_CREATE=true);
  • CHARTEVENT_OBJECT_CHANGE — событие изменения свойств объекта через диалог свойств;
  • CHARTEVENT_OBJECT_DELETE — событие удаления графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_DELETE=true);
  • CHARTEVENT_CLICK — cобытие щелчка мыши на графике;
  • CHARTEVENT_OBJECT_CLICK — событие щелчка мыши на графическом объекте, принадлежащем графику;
  • CHARTEVENT_OBJECT_DRAG — событие перемещения графического объекта при помощи мыши;
  • CHARTEVENT_OBJECT_ENDEDIT — событие окончания редактирования текста в поле ввода графического объекта LabelEdit;
  • CHARTEVENT_CHART_CHANGE — событие изменения графика;
  • CHARTEVENT_CUSTOM+n — идентификатор пользовательского события, где n находится в диапазоне от 0 до 65535.
  • CHARTEVENT_CUSTOM_LAST — последний допустимый идентификатор пользовательского события (CHARTEVENT_CUSTOM+65535).

Функция может вызываться в экспертах и индикаторах, должна иметь тип void и 4 параметра:

void OnChartEvent(const int id, // идентификатор события
const long& lparam, // параметр события типа long
const double& dparam, // параметр события типа double
const string& sparam // параметр события типа string
);

Для каждого типа события входные параметры функции OnChartEvent() имеют определенные значения, которые необходимы для обработки этого события. В таблице перечислены события и значения, которые передаются через параметры.

Событие | Значение параметра id | Значение параметра lparam | Значение параметра dparam | Значение параметра sparam
Событие нажатия клавиатуры | CHARTEVENT_KEYDOWN | Код нажатой клавиши | Количество нажатий клавиши,сгенерированных за время её удержания в нажатом состоянии | Строковое значение битовой маски, описывающее статус кнопок клавиатуры
События мыши (если для графика установлено свойство CHART_EVENT_MOUSE_MOVE=true) | CHARTEVENT_MOUSE_MOVE | X координата | Y координата | Строковое значение битовой маски, описывающее статус кнопок мыши
Событие создания графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_CREATE=true) | CHARTEVENT_OBJECT_CREATE | — | — | Имя созданного графического объекта
Событие изменения свойств объекта через диалог свойств | CHARTEVENT_OBJECT_CHANGE | — | — | Имя измененного графического объекта
Событие удаления графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_DELETE=true) | CHARTEVENT_OBJECT_DELETE | — | — | Имя удаленного графического объекта
Событие щелчка мыши на графике | CHARTEVENT_CLICK | X координата | Y координата | —
Событие щелчка мыши на графическом объекте | CHARTEVENT_OBJECT_CLICK | X координата | Y координата | Имя графического объекта, на котором произошло событие
Событие перемещения графического объекта при помощи мыши | CHARTEVENT_OBJECT_DRAG | — | — | Имя перемещенного графического объекта
Событие окончания редактирования текста в поле ввода графического объекта "Поле ввода" | CHARTEVENT_OBJECT_ENDEDIT | — | — | Имя графического объекта "Поле ввода", в котором завершилось редактирование текста
Событие изменения графика | CHARTEVENT_CHART_CHANGE | — | — | —
Пользовательское событие с номером N | CHARTEVENT_CUSTOM+N | Значение, заданное функцией EventChartCustom() | Значение, заданное функцией EventChartCustom() | Значение, заданное функцией EventChartCustom()

OnCalculate

Функция OnCalculate() вызывается только в пользовательских индикаторах при необходимости произвести расчет значений индикатора по событию Calculate. Обычно это происходит при поступлении нового тика по символу, для которого рассчитывается индикатор. При этом индикатор не обязательно должен быть прикреплен к какому-нибудь ценовому графику данного символа.

Функция OnCalculate() должна иметь тип возвращаемого значения int.

int OnCalculate (const int rates_total, // размер входных таймсерий
const int prev_calculated, // обработано баров на предыдущем вызове
const datetime &time[], // Time
const double &open[], // Open
const double &high[], // High
const double &low[], // Low
const double &close[], // Close
const long &tick_volume[], // Tick Volume
const long &volume[], // Real Volume
const int &spread[] // Spread
);

Параметры open[], high[], low[] и close[] содержит массивы с ценами открытия, максимальной, минимальной ценами и ценами закрытия текущего таймфрейма. Параметр time[] содержит массив со значениями времени открытия, параметр spread[] – массив, содержащий историю спредов (если спред предусмотрен для данного торгового инструмента). Параметры volume[] и tick_volume[] содержат соответственно историю торгового и тикового объема.

Чтобы определить направление индексации в массивах time[], open[], high[], low[], close[], tick_volume[], volume[] и spread[], необходимо вызывать функцию ArrayGetAsSeries(). Чтобы не зависеть от умолчаний, необходимо безусловно вызывать функцию ArraySetAsSeries() для тех массивов, с которыми предполагается работать.

Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и соответствует количеству баров, доступных на графике.

Необходимо отметить связь между значением, возвращаемым функцией OnCalculate() и вторым входным параметром prev_calculated. Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове. Это позволяет реализовать экономные алгоритмы расчета пользовательского индикатора с тем, чтобы избежать повторных расчетов для тех баров, которые не изменились с предыдущего запуска этой функции.

Для этого обычно достаточно вернуть значение параметра rates_total, которое содержит количество баров при текущем вызове функции. Если с момента последнего вызова функции OnCalculate() ценовые данные были изменены (подкачана более глубокая история или были заполнены пропуски истории), то значение входного параметра prev_calculated будет установлено в нулевое значение самим терминалом.

Для лучшего понимания будет полезно запустить индикатор, код которого приложен ниже.

Пример индикатора:

#property indicator_chart_window
#property indicator_buffers 1
//---- plot Line
#property indicator_label1 "Line"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDarkBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- indicator buffers
double LineBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);
//---
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[])
{
//--- получим количество доступных баров для текущих символа и периода на графике
int bars=Bars(Symbol(),0);
Print("Bars = ",bars,", rates_total = ",rates_total,", prev_calculated = ",prev_calculated);
Print("time[0] = ",time[0]," time[rates_total-1] = ",time[rates_total-1]);
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+

Смотри также

Выполнение программ, События клиентского терминала, Работа с событиями


Переменные

Справочник MQL4 / Основы языка / Переменные

Переменные

Объявление переменных

Переменные должны быть объявлены перед их использованием. Для идентификации переменных используются уникальные имена. Описания переменных используются для их определения и объявления типов. Описание не является оператором.

Простыми типами являются:

  • char, short, int, long, uchar, ushort, uint, ulong – целые числа;
  • color – целое число, представляющее RGB-цвет;
  • datetime – дата и время, беззнаковое целое число, содержащее количество секунд, прошедших с 0 часов 1 января 1970 года;
  • bool – логические значения true и false;
  • double – числа двойной точности с плавающей точкой;
  • float – числа одинарной точности с плавающей точкой;
  • string – символьные строки.

Примеры:

string szInfoBox;
int nOrders;
double dSymbolPrice;
bool bLog;
datetime tBegin_Data = D'2004.01.01 00:00';
color cModify_Color = C'0x44,0xB9,0xE6';

Сложные или составные типы:

Структуры – это составные типы данных, построенные с использованием других типов.

struct MyTime
{
int hour; // 0-23
int minute; // 0-59
int second; // 0-59
};
...
MyTime strTime; // переменная типа объявленной ранее структуры MyTime

До тех пор пока структура не объявлена, нельзя объявлять переменные типа структуры.

Массивы

Массив - это индексированная совокупность однотипных данных:

int a[50]; // Одномерный массив из 50 целых чисел.
double m[7][50]; // Двухмерный массив из семи массивов,
// каждый из которых состоит из 50 чисел.
MyTime t[100]; // массив содержащий элементы типа MyTime

Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Нумерация элементов массива начинается с 0. Последний элемент одномерного массива имеет номер на 1 меньший, чем размер массива, то есть обращение к последнему элементу массива из 50 целых чисел будет выглядеть как a[49]. То же самое относится и к многомерным массивам – индексация одного измерения производится от 0 до размер измерения-1. Последний элемент двумерного массива из примера будет выглядеть как m[6][49].

Статические массивы не могут быть представлены в виде таймсерий, то есть к ним не применима функция ArraySetAsSeries(), которая устанавливает доступ к элементам массива от конца массива к его началу. Если требуется обеспечить доступ к массиву как в таймсериях, используйте объект динамического массива.

При доступе за пределы массива исполняющая подсистема сгенерирует критическую ошибку и выполнение программы будет остановлено.

Спецификаторы доступа

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

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

Пример

int OnCalculate (const int rates_total, // размер входных таймсерий
const int prev_calculated, // обработано баров на предыдущем вызове
const datetime &time[], // Time
const double &open[], // Open
const double &high[], // High
const double &low[], // Low
const double &close[], // Close
const long &tick_volume[], // Tick Volume
const long &volume[], // Real Volume
const int &spread[] // Spread
);

Для доступа к членам структур и классов используются следующие спецификаторы:

  • public – разрешает ничем неограниченный доступ к переменной или методу класса;
  • protected – разрешает доступ со стороны методов данного класса, а также со стороны методов публично наследуемых классов. Иной доступ невозможен;
  • private – разрешает доступ к переменным и методам класса только из методов данного класса.
  • virtual – применим только к методам класса (но не к методам структур) и сообщает компилятору, что данный метод должен быть размещен в таблице виртуальных функций класса.

Классы памяти

Существуют три класса памяти: static, input и extern. Эти модификаторы класса памяти явно указывают компилятору, что соответствующие переменные распределяются в предопределенной области памяти, называемой глобальным пулом. При этом данные модификаторы указывают на особую обработку данных переменных.

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

Смотри также

Типы данных, Инкапсуляция и расширяемость типов, Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов, Статические члены класса


Локальные переменные

Справочник MQL4 / Основы языка / Переменные / Локальные переменные

Локальные переменные

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

Пример:

int somefunc()
{
int ret_code=0;
...
return(ret_code);
}

Область действия (или область видимости) переменной – это часть программы, в которой на переменную можно сослаться. Переменные, объявленные внутри блока (на внутреннем уровне), имеют областью действия блок. Область действия блок начинается объявлением переменной и заканчивается конечной правой фигурной скобкой.

Локальные переменные, объявленные в начале функции, имеют область действия блок так же, как и параметры функции, являющиеся локальными переменными. Любой блок может содержать объявления переменных. Если блоки вложены и идентификатор во внешнем блоке имеет такое же имя, как идентификатор во внутреннем блоке, идентификатор внешнего блока "невидим" (скрыт) до момента завершения работы внутреннего блока.

Пример:

void OnStart()
{
//---
int i=5; // локальная переменная функции
{
int i=10; // переменная функции
Print("В блоке i = ",i); // результат i = 10;
}
Print("Вне блока i = ",i); // результат i = 5;
}

Это означает, что пока выполняется внутренний блок, он видит значения своих собственных локальных идентификаторов, а не значения идентификаторов с идентичными именами в охватывающем блоке.

Пример:

void OnStart()
{
//---
int i=5; // локальная переменная функции
for(int i=0;i<3;i++)
Print("Внутри for i = ",i);
Print("Вне блока i = ",i);
}
/* Результат выполнения
Внутри for i = 0
Внутри for i = 1
Внутри for i = 2
Вне блока i = 5
*/

Локальные переменные, объявленные как static, имеют областью действия блок, несмотря на то, что они существуют с самого начала выполнения программы.

Стек

В каждой MQL4-программе под хранение локальных автоматически создаваемых переменных функций выделяется специальная область памяти, называемая стеком. Стек выделяется один на все функции и по умолчанию размер стека составляет 256 kb, размером стека можно управлять директивой компилятора #property stacksize.

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

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

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

Поэтому для больших локальных данных лучше использовать динамическую память - при входе в функцию память под локальные нужды выделять в системе (new, ArrayResize()), а при выходе из функции производить освобождение памяти (delete, ArrayFree()).

Смотри также

Типы данных, Инкапсуляция и расширяемость типов, Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Формальные параметры

Справочник MQL4 / Основы языка / Переменные / Формальные параметры

Формальные параметры

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

Пример:

void func(const int & x[], double y, bool z)
{
if(y>0.0 && !z)
Print(x[0]);
...
}

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

Пример:

void func(int x, double y = 0.0, bool z = true)
{
...
}

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

Пример:

func(123, 0.5);

Параметры простых типов передаются по значению, то есть изменения соответствующей локальной переменной такого типа внутри вызываемой функции никак не отразятся в вызывающей функции. Массивы любых типов и данные типа структур всегда передаются по ссылке. Если необходимо запретить изменение массива или содержимого структуры, параметры этих типов должны быть объявлены с ключевым словом const.

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

Пример:

void func(int& x, double& y, double & z[])
{
double calculated_tp;
...
for(int i=0; i<OrdersTotal(); i++)
{
if(i==ArraySize(z)) break;
if(OrderSelect(i)==false) break;
z[i]=OrderOpenPrice();
}
x=i;
y=calculated_tp;
}

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

В функцию нельзя передать больше 64 параметров.

Смотри также

Input переменные, Типы данных, Инкапсуляция и расширяемость типов, Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Статические переменные

Справочник MQL4 / Основы языка / Переменные / Статические переменные

Статические переменные

Класс памяти static определяет статическую переменную. Модификатор static указывается перед типом данных.

Пример:

int somefunc()
{
static int flag=10;
...
return(flag);
}

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

Статические переменные существуют с момента выполнения программы и инициализируются однократно сразу после загрузки программы. Если начальные значения не указаны, то переменные статического класса памяти принимают нулевые начальные значения. Время жизни статических переменных такое же, как и у глобальных переменных: от загрузки до выгрузки mql4-программы. Область их видимости - локальна, в пределах блока, в котором они объявлены.

Локальные переменные, объявленные с ключевым словом static, сохраняют свои значения в течение всего времени существования функции. При каждом следующем вызове функции такие локальные переменные содержат те значения, которые они имели при предыдущем вызове.

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

Пример:

int Counter()
{
static int count;
count++;
if(count%100==0) Print("Функция Counter была вызвана уже ",count," раз");
return count;
}
void OnStart()
{
//---
int c=345;
for(int i=0;i<1000;i++)
{
int c=Counter();
}
Print("c = ",c);
}

Смотри также

Типы данных, Инкапсуляция и расширяемость типов, Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов, Статические члены класса


Глобальные переменные

Справочник MQL4 / Основы языка / Переменные / Глобальные переменные

Глобальные переменные

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

Пример:

int GlobalFlag=10; // глобальная переменная
int OnStart()
{
...
}

Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе. Инициализируются нулем, если явно не задано другое начальное значение. Глобальная переменная может быть проинициализирована только соответствующей ее типу константой либо константным выражением.

Инициализация глобальных переменных производится однократно после загрузки программы в память клиентского терминала и перед первой обработкой события Init. Для глобальных переменных, представляющих собой объекты классов, при инициализации вызываются соответствующие конструкторы.

Время жизни глобальных переменных такое же, как и у статических переменных: от загрузки до выгрузки MQL4-программы.

Замечание: не следует путать переменные, объявленные на глобальном уровне, с глобальными переменными клиентского терминала, доступ к которым осуществляется при помощи функций GlobalVariable...().

Смотри также

Типы данных, Инкапсуляция и расширяемость типов, Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Input переменные

Справочник MQL4 / Основы языка / Переменные / Input переменные

Input переменные

Класс памяти input определяет внешнюю переменную. Модификатор input указывается перед типом данных. Изменять значение переменной с модификатором input внутри mql4-программы нельзя, такие переменные доступны только для чтения. Изменять значения input-переменных может только пользователь из окна свойств программы. Внешние переменные всегда переинициализируются непосредственно перед вызовом OnInit().

Пример:

//--- input parameters
input int MA_Period=13;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMMA;

Input переменные определяют входные параметры программы, они доступны из окна свойств программы.

Установка значения для input-параметра

Существует возможность задать иной способ отображения имен входных параметров на закладке "Inputs". Для этого используется строчный комментарий, который должен располагаться после описания входного параметра в той же строке. Таким образом, входным параметрам можно сопоставить более понятные для пользователя имена.

Пример:

//--- input parameters
input int InpMAPeriod=13; // Smoothing period
input int InpMAShift=0; // Line horizontal shift
input ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // Smoothing method

Человечный способ отображения входных параметров

Примечание: Массивы и переменные сложных типов не могут выступать в качестве input-переменных.

Примечание: Длина строчного комментария для Input переменных не может превышать 63 символа.

Передача параметров при вызове пользовательских индикаторов из mql4-программ

Пользовательские индикаторы вызываются при помощи функции iCustom(). При этом после имени пользовательского индикатора должны идти параметры в точном соответствии с объявлением input-переменных данного пользовательского индикатора. Если параметров указывается меньше, чем объявлено input-переменных в вызываемом пользовательском индикаторе, то недостающие параметры заполняются значениями, указанными при объявлении переменных.

Если в пользовательском индикаторе используется функция OnCalculate первого вида (то есть, индикатор считается на одном массиве данных), то в качестве последнего параметра при вызове такого пользовательского индикатора должно выступать одно из значений ENUM_APPLIED_PRICE либо хэндл другого индикатора. При этом все параметры, соответствующие input-переменным, должны быть явно указаны.

Перечисления в качестве input-параметра

В качестве input-переменных (входных параметров для mql4-программ) можно использовать не только предусмотренные языком MQL4 встроенные перечисления, но и перечисления, заданные пользователем. Например, мы можем создать перечисление dayOfWeek, описывающее дни недели, и использовать input-переменную для указания конкретного дня недели не в виде цифры, а в более привычном для пользователя виде.

Пример:

#property script_show_inputs
//--- day of week
enum dayOfWeek
{
S=0, // Sunday
M=1, // Monday
T=2, // Tuesday
W=3, // Wednesday
Th=4, // Thursday
Fr=5, // Friday,
St=6, // Saturday
};
//--- input parameters
input dayOfWeek swapday=W;

Для того чтобы при запуске скрипта пользователь мог выбрать нужное значение из окна свойств, мы используем команду препроцессора #property script_show_inputs. Запускаем скрипт на исполнение и можем выбрать из списка одно из значений перечислений dayOfWeek. Запускаем скрипт EnumInInput и переходим на закладку "Параметры". По умолчанию, значение параметра swapday (день начисления тройного свопа) является среда (W=3), но мы можем задать любое другое значение и использовать это значение для изменения работы программы.

Пример пользовательского перечисления в качестве input-параметра

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

Каждое значение из перечисления dayOfWeek имеет свое значение от 0 до 6, но в списке параметров будут показаны комментарии, указанные для каждого значения. Это дает дополнительную гибкость для написания программ с понятными описаниями входных параметров.

Переменные с модификатором sinput

Переменные с модификатором input позволяют не только задавать значения внешних параметров при запуске программ, но также играют большую роль при оптимизации торговых стратегий в тестере. Каждая объявленная в эксперте input-переменная, за исключением типа string, может участвовать в оптимизации.

В некоторых случаях бывает необходимо исключить некоторые внешние параметры программы из формирования области всех возможных проходов в тестере. Специально для таких случаев существует модификатор памяти sinput. sinput - это сокращенное написание объявления статической внешней переменной: sinput = static input. То есть такое объявление в коде советника

sinput int layers=6; // Количество слоев

будет эквивалентно полному объявлению

static input int layers=6; // Количество слоев

Переменная, объявленная с модификатором sinput, является входным параметром MQL4-программы, значение этого параметра можно изменять при её запуске. Но при этом данная переменная не участвует в процессе оптимизации входных параметров, то есть не производится перебор её значений при поиске наилучшего набора параметров по заданному критерию.

Отображение sinput-параметра в тестере стратегий

На рисунке показано, что эксперт имеет 5 внешних параметров, из них параметр "Количество слоев" объявлен как sinput и равен 6. Этот параметр не может изменяться в процедуре оптимизации торговой стратегии, для него возможно установить нужное значение, которое и будет использоваться. Поля Старт, Шаг и Стоп для такой переменной не доступны для установки значений.

Таким образом, задав для переменной модификатор sinput, мы запрещаем пользователю оптимизировать данный параметр. Это значит, что в тестере стратегий пользователю терминала становится недоступным задавать для неё начальное и конечное значения для автоматического перебора в указанном диапазоне в процессе оптимизации.

Но при этом есть одно исключение из данного правила – sinput-переменные можно варьировать в задачах оптимизации с помощью функции ParameterSetRange(). Данная функция создана специально для программного управления пространством доступных значений для любых input-переменных, в том числе и объявленных как static input (sinput). Другая функция ParameterGetInput() позволяет при запуске оптимизации (в обработчике OnTesterInit()) получить значения input-переменных и в случае необходимости переопределить шаг изменения и диапазон, в пределах которого будет перебираться значение оптимизируемого параметра.

Таким образом, сочетание модификатора sinput и двух функций по работе с input-параметрами позволяет создавать гибкие правила для задания интервалов оптимизации одних input-переменных в зависимости от значения других input-переменных.

Смотри также

iCustom(), Перечисления, Свойства программ


Extern переменные

Справочник MQL4 / Основы языка / Переменные / Extern переменные

Extern переменные

Класс памяти extern определяет внешнюю переменную. Модификатор extern указывается перед типом данных.

//--- extern parameters
extern int MA_Period=13;
extern int MA_Shift=0;
extern ENUM_MA_METHOD MA_Method=MODE_SMMA;

Подобно input-переменным, extern-переменные также определяют входные параметры mql4-программы, они доступны из окна свойств. В отличии input-переменных, значения extern-переменных могут быть программно изменены в процессе работы программы. Внешние переменные всегда переинициализируются непосредственно перед вызовом OnInit().

Пример:

//--- строгий режим компиляции
#property strict
//--- режим показа входных параметров
#property script_show_inputs
//--- объявление extern и input-переменных
extern int ExtVar=1; // extern переменная ExtVar
input int InpVar=2; // input переменная InpVar
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- выведем значения переменных ExtVar и InpVar
PrintFormat("Extern=%d, Input=%d",ExtVar,InpVar);
//--- увеличим на единицу значение переменной ExtVar
ExtVar++;
//--- попытка изменения input-переменной приведет к ошибке компиляции
//--- InpVar++;
//--- выведем значения переменных ExtVar и InpVar
PrintFormat("Extern=%d, Input=%d",ExtVar,InpVar);
}

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

Примечание: Массивы и переменные сложных типов не могут выступать в качестве extern-переменных.

Примечание: Длина строчного комментария для extern-переменных не может превышать 63 символа.

Смотри также

Input переменные, Типы данных, Инкапсуляция и расширяемость типов, Инициализация переменных, Область видимости и время жизни переменных, Создание и уничтожение объектов


Инициализация переменных

Справочник MQL4 / Основы языка / Переменные / Инициализация переменных

Инициализация переменных

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

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

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

Примеры:

int n = 1;
string s = "hello";
double f[] = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 };
int a[4][4] = { {1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}, {4, 4, 4, 4 } };
//--- из тетриса
int right[4]={WIDTH_IN_PIXELS+VERT_BORDER,WIDTH_IN_PIXELS+VERT_BORDER,
WIDTH_IN_PIXELS+VERT_BORDER,WIDTH_IN_PIXELS+VERT_BORDER};
//--- инициализация всех полей структуры нулевым значением
MqlTradeRequest request={0};

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

Если размер инициализируемого массива не указан, то он определяется компилятором, исходя из размера инициализирующей последовательности. Многомерные массивы не могут инициализироваться одномерной последовательностью (последовательностью без дополнительных фигурных скобок), за исключением одного случая – когда указывается всего один инициализирующий элемент (как правило, ноль).

Массивы (в том числе и объявленные на локальном уровне) могут инициализироваться только константами.

Примеры:

struct str3
{
int low_part;
int high_part;
};
struct str10
{
str3 s3;
double d1[10];
int i3;
};
void OnStart()
{
str10 s10_1={{1,0},{1.0,2.1,3.2,4.4,5.3,6.1,7.8,8.7,9.2,10.0},100};
str10 s10_2={{1,0},{0},100};
str10 s10_3={{1,0},{1.0}};
//---
Print("1. s10_1.d1[5] = ",s10_1.d1[5]);
Print("2. s10_2.d1[5] = ",s10_2.d1[5]);
Print("3. s10_3.d1[5] = ",s10_3.d1[5]);
Print("4. s10_3.d1[0] = ",s10_3.d1[0]);
}

Для переменных типа структур допускается частичная инициализация, это же относится и к статическим массивам (с явно заданным размером). Можно проинициализировать один или несколько первых элементов структуры или массива, оставшиеся элементы в таком случае будут проинициализированы нулями.

Смотри также

Типы данных, Инкапсуляция и расширяемость типов, Область видимости и время жизни переменных, Создание и уничтожение объектов


Область видимости и время жизни переменных

Справочник MQL4 / Основы языка / Переменные / Область видимости и время жизни переменных

Область видимости и время жизни переменных

Существует два основных вида области видимости: локальная область видимости и глобальная область видимости.

Переменная, объявленная вне всех функций, помещается в глобальную область видимости. Доступ к таким переменным может осуществляться из любого места программы. Такие переменные располагаются в глобальном пуле памяти, поэтому время их жизни совпадает со временем жизни программы.

Переменная, объявленная внутри блока (часть кода, заключенная в фигурные скобки), принадлежит локальной области видимости. Такая переменная не видна (поэтому и недоступна) за пределами блока, в котором она объявлена. Самый распространенный случай локального объявления – переменная, объявленная внутри функции. Переменная, объявленная локально, располагается на стеке, и время жизни такой переменной совпадает со временем жизни функции.

Так как областью видимости локальной переменной является блок, в котором она объявлена, то существует возможность объявлять переменные с именем, совпадающим с именами переменных, объявленных в других блоках; а также объявленных на более верхних уровнях, вплоть до глобального.

Пример:

void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[])
{
int i,limit;
static int weightsum=0;
double sum=0;
//---
if(prev_calculated==0)
{
limit=MA_Period+begin;
//--- set empty value for first limit bars
for(i=0; i<limit; i++) LineBuffer[i]=0.0;
//--- calculate first visible value
double firstValue=0;
for(int i=begin; i<limit; i++)
{
int k=i-begin+1;
weightsum+=k;
firstValue+=k*price[i];
}
firstValue/=(double)weightsum;
LineBuffer[limit-1]=firstValue;
}
else
{
limit=prev_calculated-1;
}

for(i=limit;i<rates_total;i++)
{
sum=0;
for(int j=0; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
LineBuffer[i]=sum/weightsum;
}
//---
}

Обратите внимание на переменную i, объявленную в строке

for(int i=begin; i<limit; i++)
{
int k=i-begin+1;
weightsum+=k;
firstValue+=k*price[i];
}

Ее область видимости – только цикл for, за пределами этого цикла действует другая переменная с тем же именем, объявленная в начале функции. Кроме того, в теле цикла объявлена переменная k, областью видимости которой является тело цикла.

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

Смотри также

Типы данных, Инкапсуляция и расширяемость типов, Инициализация переменных, Создание и уничтожение объектов


Создание и уничтожение объектов

Справочник MQL4 / Основы языка / Переменные / Создание и уничтожение объектов

Создание и уничтожение объектов

После загрузки на исполнение mql4-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql4-программы, статические и автоматические. Каждая переменная при необходимости инициализируется соответствующим значением. После использования переменная деинициализируется и память, использованная ею, возвращается исполняемой системе MQL4.

Инициализация и деинициализация глобальных переменных

Инициализация глобальных переменных производится автоматически сразу после загрузки mql4-программы и до вызова любой функции. При инициализации производится присвоение начальных значений переменным простых типов и вызывается конструктор для объектов, если он есть. Входные переменные всегда объявляются на глобальном уровне, инициализируются значениями, задаваемыми пользователями в диалоге при запуске mql4-программы.

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

Порядок инициализации соответствует порядку объявления переменной в программе, а деинициализация производится в обратном порядке перед выгрузкой mql4-программы. Это правило только для тех переменных, которые не были созданы оператором new. Такие переменные создаются и инициализируются автоматически сразу после загрузки, а деинициализируются непосредственно перед выгрузкой программы.

Инициализация и деинициализация локальных переменных

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

Локальные переменные деинициализируются в конце блока программы, в котором они объявлены, и в порядке, обратном их объявлению. Блок программы – это составной оператор, который может являться частью оператора выбора switch, цикла(for, while, do-while), телом функции или частью оператора if-else.

Инициализация локальных переменных происходит только в тот момент, когда выполнение программы доходит до объявления переменной. Если в процессе выполнения программы блок, в котором объявлена переменная, не был выполнен, то такая переменная не инициализируется.

Инициализация и деинициализация динамически размещаемых объектов

Особый случай представляют из себя указатели объектов, так как объявление указателя не влечет за собой инициализации соответствующего объекта. Динамически размещаемые объекты инициализируются только в момент создания экземпляра класса оператором new. Инициализация объекта предполагает вызов конструктора соответствующего класса. Если соответствующего конструктора в классе нет, то его члены, имеющие простой тип, не будут автоматически проинициализированы; члены типов строка, динамический массив и сложный объект будут автоматически проинициализированы.

Указатели могут быть объявлены на локальном или глобальном уровне и при этом могут быть проинициализированы пустым значением NULL или значением указателя такого же или порожденного типа. Если для указателя, объявленного на локальном уровне, был вызван оператор new, то и оператор delete для этого указателя должен быть выполнен до выхода из этого уровня. В противном случае указатель будет потерян, и объект не сможет быть удален явно.

Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". Можно объявить несколько переменных и всем им присвоить указатель одного объекта.

Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, то деструктор будет вызван в момент выполнения оператора delete.

Таким образом, динамически размещаемые объекты создаются только в момент создания оператором new и гарантированно уничтожаются либо оператором delete, либо автоматически исполняющей системой MQL4 в момент выгрузки программы. Порядок объявления указателей динамически создаваемых объектов не влияет на порядок их инициализации. Порядок инициализации и деинициализации полностью контролируется программистом.

Особенности работы с динамической памятью

При работе с динамическими массивами освобожденная память сразу же возвращается в систему.

При создании динамического объекта класса через new, память сначала ищется в пуле памяти классов, с которым работает менеджер памяти, и если в пуле недостаточно памяти, то память запрашивается в системе. При удалении динамического объекта через delete, память, занимаемая объектом, возвращается в пул памяти классов.

Менеджер памяти возвращает память в систему сразу после выхода из функций-обработчиков событий: OnInit(), OnDeinit(), OnStart(), OnTick(), OnCalculate(), OnTimer(), OnTester(), OnChartEvent().

Краткая характеристика переменных

Основные сведения о порядке создания, уничтожении, вызове конструкторов и деструкторов приведены в краткой таблице.

 | Глобальная автоматическая переменная | Локальная автоматическая переменная | Динамически создаваемый объект
Инициализация | сразу после загрузки mql4-программы | при достижении в ходе выполнения строки кода, где она объявлена | при выполнении оператора new
Порядок инициализации | в порядке объявления | в порядке объявления | не зависит от порядка объявления
Деинициализация | перед выгрузкой mql4-программы | при выходе выполнения из блока объявления | при выполнении оператора delete или перед выгрузкой mql4-программы
Порядок деинициализации | в порядке, обратном инициализации | в порядке, обратном инициализации | не зависит от порядка инициализации
Вызов конструктора | при загрузке mql4-программы | при инициализации | при выполнении оператора new
Вызов деструктора | при выгрузке mql4-программы | при выходе из блока, в котором переменная была инициализирована | при выполнении оператора delete
Сообщения об ошибках | сообщение в журнал "Эксперты" о попытке удаления автоматически созданного объекта | сообщение в журнал "Эксперты" о попытке удаления автоматически созданного объекта | сообщение в журнал "Эксперты" о неудаленных динамически созданных объектах при выгрузке mql4-программы

Смотри также

Типы данных, Инкапсуляция и расширяемость типов, Инициализация переменных, Область видимости и время жизни переменных


Препроцессор

Справочник MQL4 / Основы языка / Препроцессор

Препроцессор

Препроцессор – это специальная подсистема компилятора MQL4, которая занимается предварительной подготовкой исходного текста программы непосредственно перед ее компиляцией.

Препроцессор позволяет улучшить читаемость исходного кода. Структурирование кода может быть достигнуто путем включения отдельных файлов с исходными кодами mql4-программ. Улучшению читаемости кода способствует и возможность присвоения мнемонических имен отдельным константам.

Препроцессор позволяет также определять специфические параметры mql4-программ:

  • Объявлять константы
  • Устанавливать свойства программы
  • Включать в текст программы файлы
  • Импортировать функции
  • Использовать условную компиляцию

Если в качестве первого символа в строке программы используется символ #, то эта строка является директивой препроцессора. Директива препроцессора заканчивается символом перевода на новую строку.


Макроподстановка (#define)

Справочник MQL4 / Основы языка / Препроцессор / Макроподстановка (#define)

Макроподстановка (#define, #undef)

Директива #define может быть использована для присвоения мнемонических имен выражениям. Существует две формы:

#define identifier expression // беспараметрическая форма
#define identifier(par1,... par8) expression // параметрическая форма

Директива #define подставляет expression вместо всех последующих найденных вхождений identifier в исходном тексте. identifier заменяется только в том случае, если он представляет собой отдельный токен. identifier не заменяется, если он является частью комментария, частью строки, или частью другого более длинного идентификатора.

Идентификатор константы подчиняется тем же правилам, что и для имен переменных. Значение может быть любого типа:

#define ABC 100
#define PI 3.14
#define COMPANY_NAME "MetaQuotes Software Corp."
...
void ShowCopyright()
{
Print("Copyright 2001-2009, ",COMPANY_NAME);
Print("https://www.metaquotes.net");
}

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

Пример

#define TWO 2
#define THREE 3
#define INCOMPLETE TWO+THREE
#define COMPLETE (TWO+THREE)
void OnStart()
{
Print("2 + 3*2 = ",INCOMPLETE*2);
Print("(2 + 3)*2 = ",COMPLETE*2);
}
/* Результат
2 + 3*2 = 8
(2 + 3)*2 = 10
*/

Параметрическая форма #define

При параметрической форме все последующие найденные вхождения identifier будут заменены на expression с учетом фактических параметров. Например,

// пример с двумя параметрами a и b
#define A 2+3
#define B 5-1
#define MUL(a, b) ((a)*(b))

double c=MUL(A,B);
Print("c=",c);
/*
выражение double c=MUL(A,B);
равносильно double c=((2+3)*(5-1));
*/
// Результат
// c=20

Обязательно заключайте параметры в круглые скобки при использовании параметров в expression, так как это позволит избежать неочевидных ошибок, которые трудно найти. Если переписать пример без использования скобок, то результат окажется совсем другой:

// пример с двумя параметрами a и b
#define A 2+3
#define B 5-1
#define MUL(a, b) a*b

double c=MUL(A,B);
Print("c=",c);
/*
выражение double c=MUL(A,B);
равносильно double c=2+3*5-1;
*/
// Результат
// c=16

При использовании параметрической формы допускается не более 8 параметров.

// правильная параметрическая форма
#define LOG(text) Print(__FILE__,"(",__LINE__,") :",text) // один параметр - 'text'

// неправильная параметрическая форма
#define WRONG_DEF(p1, p2, p3, p4, p5, p6, p7, p8, p9) p1+p2+p3+p4 // более 8 параметров от p1 до p9

Директива #undef

Директива #undef предназначена для отмены макроса, объявленного ранее.

Пример:

#define MACRO

void func1()
{
#ifdef MACRO
Print("MACRO is defined in ",__FUNCTION__);
#else
Print("MACRO is not defined in ",__FUNCTION__);
#endif
}

#undef MACRO

void func2()
{
#ifdef MACRO
Print("MACRO is defined in ",__FUNCTION__);
#else
Print("MACRO is not defined in ",__FUNCTION__);
#endif
}

void OnStart()
{
func1();
func2();
}

/* Результат:
MACRO is defined in func1
MACRO is not defined in func2
*/

Смотри также

Идентификаторы, Символьные константы


Свойства программ (#property)

Справочник MQL4 / Основы языка / Препроцессор / Свойства программ (#property)

Свойства программ (#property)

У каждой MQL4-программы можно указать дополнительные специфические параметры #property, которые помогают клиентскому терминалу правильно обслуживать программы без необходимости их явного запуска. В первую очередь это касается внешних настроек индикаторов. Свойства, описанные во включаемых файлах, полностью игнорируются. Свойства необходимо задавать в главном mq4-файле.

#property идентификатор значение

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

Константа

Тип

Описание

strict

Указание компилятору на применение особого строгого режима проверки ошибок (см. Обновленный MQL4)

icon

string

Путь к файлу с картинкой, которая будет показываться для программы EX4. Правила указания пути такие же, как и для ресурсов. Свойство должно указываться в главном модуле с исходным кодом MQL4. Файл иконки должен быть в формате ICO.

link

string

Ссылка на сайт компании-производителя

copyright

string

Название компании-производителя

version

string

Версия программы, не более 31 символа

description

string

Краткое текстовое описание MQL4-программы. Может присутствовать несколько description, каждый из которых описывает одну строку текста. Общая длина всех description не может превышать 511 символов с учетом переводов строк

stacksize

int

Указывает размер стека для MQL4 программы, стек достаточного объема требуется в случае выполнения рекурсивных вызовов функций.

При запуске скрипта или эксперта на графике выделяется стек не менее 8Мб, для индикаторов свойство не работает - стек всегда фиксированного объема в 1Мб.

При запуске в тестере программе всегда выделяется стек в размере 8 Мб.

library

Библиотека; не назначается никакой стартовой функции, функции с модификатором export можно импортировать в других MQL4-программах

indicator_chart_window

Выводить индикатор в окно графика

indicator_separate_window

Выводить индикатор в отдельное окно

indicator_height

int

Фиксированная высота подокна индикатора в пикселях (свойство INDICATOR_HEIGHT)

indicator_buffers

int

Количество буферов для расчета индикатора

indicator_minimum

double

Нижнее ограничение шкалы отдельного окна индикатора

indicator_maximum

double

Верхнее ограничение шкалы отдельного окна индикатора

indicator_labelN

string

Задает метку для N-ой графической серии, отображаемую в окне DataWindow

indicator_colorN

color

Цвет для вывода линии N, где N - номер графической серии; нумерация с 1

indicator_widthN

int

Толщина линии в графической серии, где N - номер графической серии; нумерация с 1

indicator_styleN

int

Стиль линии в графической серии, указываемый с помощью значения из ENUM_LINE_STYLE. N - номер графической серии, нумерация с 1

indicator_typeN

int

Стиль рисования индикатора. N - номер графической серии, нумерация с 1

indicator_levelN

double

Горизонтальный уровень N в отдельном окне индикатора

indicator_levelcolor

color

Цвет горизонтальных уровней индикатора

indicator_levelwidth

int

Толщина горизонтальных уровней индикатора

indicator_levelstyle

int

Стиль горизонтальных уровней индикатора

script_show_confirm

Выводить окно подтверждения перед запуском скрипта

script_show_inputs

Выводить окно со свойствами перед запуском скрипта и запретить вывод окна подтверждения

tester_file

string

Имя файла из папки <каталог_данных_терминала>\MQL4\Files\ для отправки на виртуальный сервер

tester_indicator

string

Имя файла индикатора из папки <каталог_данных_терминала>\MQL4\Indicators\ для отправки на виртуальный сервер

tester_library

string

Имя файла библиотеки из папки <каталог_данных_терминала>\MQL4\Libraries\ для отправки на виртуальный сервер

Свойства tester_file, tester_indicator и tester_library предназначены для описания списка файлов, требуемых для работы в виртуальном хостинге.

Файлы индикаторов, вызываемых в функции iCustom() с фиксированным именем, а также файлы всех библиотек, используемых в MQL4-программах, будут скопированы автоматически в процессе переноса.

Особенности миграции программ описаны в статье "Подготовка торгового счета к миграции на виртуальный хостинг".

Пример кода для передачи на хостинг файлов

#property tester_file "trade_patterns.csv" // файл с данными, которые будет читать советник
#property tester_indicator "smoothed_ma.ex4" // файл с пользовательским индикатором, указанным в iCustom() в виде переменной

Пример неявного указания имени индикатора в коде

string indicator_name="smoothed_ma.ex4";
double val=iCustom(NULL,0,indicator_name,13,1,0);

Пример задания описания и номера версии

#property version "3.70" // текущая версия эксперта
#property description "ZigZag универсальный с паттернами Песавенто"
#property description "В настоящий момент в индикатор встроены несколько ZigZag с различными алгоритмами"
#property description "Имеется возможность встраивать большое количество других индикаторов, показывающих максимумы и "
#property description "минимумы и автоматически строить от этих минимумов и максимумов различные графические инструменты"

Пример отображения описания и версии при запуске программы


Включение файлов (#include)

Справочник MQL4 / Основы языка / Препроцессор / Включение файлов (#include)

Включение файлов (#include)

Командная строка #include может встречаться в любом месте программы, но обычно все включения размещаются в начале файла исходного текста. Формат вызова:

#include <имя_файла>
#include "имя_файла"

Примеры:

#include <WinUser32.mqh>
#include "mylib.mqh"

Препроцессор заменяет строку #include <имя_файла> содержимым файла WinUser32.mqh. Угловые скобки обозначают, что файл WinUser32.mqh будет взят из стандартного каталога (обычно это каталог_терминала\MQL4\Include). Текущий каталог не просматривается.

Если имя файла заключено в кавычки, то поиск производится в текущем каталоге (в котором содержится основной файл исходного текста). Cтандартный каталог не просматривается.

Смотри также

Импорт функций


Импорт функций (#import)

Справочник MQL4 / Основы языка / Препроцессор / Импорт функций (#import)

Импорт функций (#import)

Импорт функций осуществляется из откомпилированных модулей MQL4 (файлы *.ex4) и из модулей операционной системы (файлы *.dll). Имя модуля указывается в директиве #import. Для того чтобы компилятор мог правильно оформить вызов импортируемой функции и организовать правильную передачу параметров, необходимо полное описание функций. Описания функций следуют непосредственно за директивой #import "имя модуля". Новая команда #import (можно без параметров) завершает блок описания импортируемых функций.

#import "имя_файла"
func1 define;
func2 define;
...
funcN define;
#import

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

Порядок поиска файла, указанного после ключевого слова #import, описан в разделе Вызов импортируемых функций.

Так как импортируемые функции находятся вне компилируемого модуля, компилятор не может проверить правильность передаваемых параметров. Поэтому, во избежание ошибок выполнения, необходимо точно описывать состав и порядок параметров, передаваемых в импортируемые функции. Параметры, передаваемые в импортируемые функции (как из EX4, так и из DLL-модулей), могут иметь значения по умолчанию.

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

  • указатели (*);
  • ссылки на объекты, содержащие динамические массивы и/или указатели.

В импортируемые из DLL функции нельзя передавать в качестве параметра классы, массив строк или сложные объекты, содержащие строки и/или динамические массивы любых типов.

Примеры:

#import "user32.dll"
int MessageBoxW(uint hWnd,string lpText,string lpCaption,uint uType);
#import "stdlib.ex4"
string ErrorDescription(int error_code);
int RGB(int red_value,int green_value,int blue_value);
bool CompareDoubles(double number1,double number2);
string DoubleToStrMorePrecision(double number,int precision);
string IntegerToHexString(int integer_number);
#import "ExpertSample.dll"
int GetIntValue(int);
double GetDoubleValue(double);
string GetStringValue(string);
double GetArrayItemValue(double &arr[],int,int);
bool SetArrayItemValue(double &arr[],int,int,double);
double GetRatesItemValue(double &rates[][6],int,int,int);
#import

Для импорта функций во время выполнения mql4-программы используется раннее связывание. Это значит, что библиотека загружается в процессе загрузки использующей ее ex4-программы.

Не рекомендуется использовать полностью квалифицированное имя загружаемого модуля вида Drive:\Directory\FileName.Ext. Библиотеки MQL4 загружаются из папки terminal_dir\MQL4\Libraries.

Смотри также

Включение файлов


Условная компиляция (#ifdef, #ifndef, #else, #endif)

Справочник MQL4 / Основы языка / Препроцессор / Условная компиляция (#ifdef, #ifndef, #else, #endif)

Условная компиляция (#ifdef, #ifndef, #else, #endif)

Директивы условной компиляции препроцессора позволяют компилировать или пропускать часть программы в зависимости от выполнения некоторого условия.

Условие может принимать одну из описываемых ниже форм.

#ifdef identifier
// код, находящийся здесь, компилируется, если identifier уже был определен для препроцессора в команде #define.
#endif

#ifndef identifier
// код, находящийся здесь, компилируется, если identifier в данный момент не определен командой препроцессора #define.
#endif

За любой из команд условной компиляции может следовать произвольное число строк, содержащих, возможно, команду вида #else и заканчивающихся #endif. Если проверяемое условие справедливо, то строки между #else и #endif игнорируются. Если же проверяемое условие не выполняется, то игнорируются все строки между проверкой и командой #else, а если ее нет, то командой #endif.

Пример:

#ifndef TestMode
#define TestMode
#endif
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
#ifdef TestMode
Print("Test mode");
#else
Print("Normal mode");
#endif
}

В зависимости от типа программы и режима компиляции стандартные макросы определяются следующим образом:

Макрос __MQL4__ доступен при компиляции файла *.mq4, при компиляции *.mq5 доступен макрос __MQL5__.
Макрос _DEBUG доступен при компиляции под отладку.
Макрос _RELEASE доступен при компиляции не под отладку.

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
#ifdef __MQL5__
#ifdef _DEBUG
Print("Hello from MQL5 compiler [DEBUG]");
#else
#ifdef _RELEASE
Print("Hello from MQL5 compiler [RELEASE]");
#endif
#endif
#else
#ifdef __MQL4__
#ifdef _DEBUG
Print("Hello from MQL4 compiler [DEBUG]");
#else
#ifdef _RELEASE
Print("Hello from MQL4 compiler [RELEASE]");
#endif
#endif
#endif
#endif
}


Объектно-ориентированное программирование

Справочник MQL4 / Основы языка / Объектно-ориентированное программирование

Объектно-ориентированное программирование

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

Составными частями объектно-ориентированного подхода являются:

  • Инкапсуляция и расширяемость типов
  • Наследование
  • Полиморфизм
  • Перегрузка
  • Виртуальные функции

ООП рассматривает вычисления как моделирование поведения. То, что моделируется, является объектами, представленными вычислительными абстракциями. Допустим, мы хотим написать хорошо всем известную игру "Тетрис", для этого мы должны научиться моделировать появление случайной фигуры, составленной из четырех квадратиков, соединенных друг с другом ребрами. Также требуется регулировать скорость падения фигуры, задать операции вращения и сдвига фигуры. Перемещения фигуры на экране ограничены границами стакана, это требование мы также должны смоделировать. Кроме того, заполненные ряды кубиков в стакане должны уничтожаться и необходимо вести подсчет очков, заработанных в игре.

Таким образом, такая простая в понимании игра требует создания нескольких моделей - модель фигуры, модель стакана, модель движения фигуры в стакане и так далее. Все эти модели являются абстракциями, представленными вычислениями в компьютере. Для описания таких моделей применяют понятие абстрактный тип данных, АТД (или сложный тип данных). Строго говоря, модель движения "фигуры" в "стакане" не является типом данных, а является совокупностью операций над данными типа "фигура", использующих ограничения данных типа "стакан".

Объекты являются переменными класса. Объектно-ориентированное программирование позволяет легко создавать и использовать АТД. Объектно-ориентированное программирование использует механизм наследования. Наследование выгодно тем, что позволяет получать производные типы из уже определенных пользователем типов данных. Так, для создания фигур в тетрисе удобно сначала создать базовый класс Shape, на основе которого получены производные типы всех семи возможных в тетрисе фигур. В базовом классе определено поведение фигур, а в производных уточнена реализация поведения каждой конкретной фигуры.

В ООП объекты отвечают за свое поведение. Разработчик АТД должен включать в него код для описания любого поведения, которое обычно можно ожидать от соответствующих объектов. То, что объект сам отвечает за свое поведение, значительно упрощает задачу программирования для пользователя этого объекта.

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

Язык MQL4 является С++ подобным, и в нем также реализован механизм инкапсуляции для реализации АТД. Инкапсуляция сочетает в себе, с одной стороны, внутренние детали реализации конкретного типа и, с другой, доступные извне функции, которые могут действовать на объекты этого типа. Детали реализации могут быть недоступны для программы, которая использует данный тип.

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

  • Моделирование действий из реального мира
  • Наличие типов данных, определяемых пользователем
  • Сокрытие деталей реализации
  • Возможность многократного использования кода благодаря наследованию
  • Интерпретация вызовов функций на этапе исполнения

Некоторые из этих понятий довольно расплывчаты, некоторые – абстрактны, другие носят общий характер.


Инкапсуляция и расширяемость типов

Справочник MQL4 / Основы языка / Объектно-ориентированное программирование / Инкапсуляция и расширяемость типов

Инкапсуляция и расширяемость типов

ООП – это сбалансированный подход к написанию программного обеспечения. Данные и поведение упакованы вместе. Такая инкапсуляция создает определяемые пользователем типы данных, расширяющие собственные типы данных языка и взаимодействующие с ними. Расширяемость типов – это возможность добавлять к языку определяемые пользователем типы данных,которые также легко использовать, как и основные типы.

Абстрактный тип данных, например, строка, является описанием идеального, всем известного поведения типа. Пользователь строки знает, что операции, такие как конкатенация или печать, имеют определенное поведение. Операции конкатенации и печати называются методами.

Конкретная реализация АТД может иметь ограничения; например, строки могут быть ограничены по длине. Эти ограничения влияют на открытое всем поведение. В то же время, внутренние или закрытые детали реализации не влияют прямо на то, как пользователь видит объект. Например, строка часто реализуется как массив; при этом внутренний базовый адрес элементов этого массива и его имя не существенны для пользователя.

Инкапсуляция – это способность скрывать внутренние детали при предоставлении открытого интерфейса к определяемому пользователем типу. В MQL4, как и в C++, для обеспечения инкапсуляции используются определения класса и структуры (class и struct) в сочетании с ключевыми словами доступа private (закрытый), protected (защищенный) и public (открытый).

Ключевое слово public показывает, что доступ к членам, которые стоят за ним, является открытым безо всяких ограничений. Без этого ключевого слова члены класса по умолчанию закрыты. Закрытые члены доступны только функциям-членам только своего класса.

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

Обычно стараются защищать члены класса и объявлять их с модификатором protected, установку и чтение значений этих членов осуществляется с помощью специальныx так называемых set- и get-методов, которые определяются с модификатором доступа public.

Пример:

class CPerson
{
protected:
string m_name; // имя
public:
void SetName(string n){m_name=n;}// устанавливает имя
string GetName(){return (m_name);} // возвращает имя
};

Такой подход дает несколько преимуществ. Во-первых, по имени функции можно понять что она делает – устанавливает или получает значение члена класса. Во-вторых, возможно в будущем нам понадобится изменить тип переменной m_name в самом классе CPerson или в каком-либо из производных от него классов.

В таком случае нам достаточно будет изменить реализацию функций SetName() и GetName(), сами же объекты класса CPerson можно будет использовать в программе без каких-либо изменений в коде, так как пользователь не будет даже знать,что тип данных m_name изменился.

Пример:

struct Name
{
string first_name; // имя
string last_name; // фамилия
};

class CPerson
{
protected:
Name m_name; // имя
public:
void SetName(string n);
string GetName(){return(m_name.first_name+" "+m_name.last_name);}
private:
string GetFirstName(string full_name);
string GetLastName(string full_name);
};

void CPerson::SetName(string n)
{
m_name.first_name=GetFirstName(n);
m_name.last_name=GetLastName(n);
}

string CPerson::GetFirstName(string full_name)
{
int pos=StringFind(full_name," ");
if(pos>0) StringSetCharacter(full_name,pos,0);
return(full_name);
}

string CPerson::GetLastName(string full_name)
{
string ret_string;
int pos=StringFind(full_name," ");
if(pos>0) ret_string=StringSubstr(full_name,pos+1);
else ret_string=full_name;
return(ret_string);
}

Смотри также

Типы данных


Наследование

Справочник MQL4 / Основы языка / Объектно-ориентированное программирование / Наследование

Наследование

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

Многие типы представляют собой вариации на темы существующих. Часто бывает утомительно разрабатывать новый код для каждого из них. Кроме того, новый код – новые ошибки. Производный класс наследует описание базового класса, делая ненужными повторную разработку и тестирование кода. Отношения наследования иерархичны.

Иерархия - это метод, позволяющий копировать элементы во всем их многообразии и сложности. Она вводит классификацию объектов. Например, в периодической системе элементов есть газы. Они обладают свойствами, присущими всем элементам системы.

Инертные газы – следующий важный подкласс. Иерархия заключается в том, что инертный газ, например, аргон – это газ, а газ, в свою очередь является элементом системы. Такая иерархия позволяет легко толковать поведение инертных газов. Мы знаем, что их атомы содержат протоны и электроны, что верно и для прочих элементов.

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

Рассмотрим наследование на примере геометрических фигур. Для описания всего многообразия простых фигур (круг, треугольник, прямоугольник, квадрат и так далее) лучше всего создать базовый класс (АТД), который является прародителем всех производных классов.

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

Пример:

//--- Базовый класс Фигура
class CShape
{
protected:
int m_type; // тип фигуры
int m_xpos; // X - координата точки привязки
int m_ypos; // Y - координата точки привязки
public:
CShape(){m_type=0; m_xpos=0; m_ypos=0;} // конструктор
void SetXPos(int x){m_xpos=x;} // установим X
void SetYPos(int y){m_ypos=y;} // установим Y
};

Далее создадим от базового класса производные классы, в которых добавим необходимые поля, уточняющие каждый конкретный класс. Для фигуры Circle (круг) необходимо добавить член, который содержит значение радиуса. Фигура Quadrate (квадрат) характеризуется значением стороны квадрата. Поэтому производные классы, унаследованнные от базового класса CShape, будут объявлены таким образом:

//--- производный класс Круг
class CCircle : public CShape // после двоеточия указывается базовый класс,
{ // от которого производится наследование
private:
int m_radius; // радиус круга

public:
CCircle(){m_type=1;} // конструктор, тип равен 1
};

Для квадрата объявление класса выглядит аналогично:

//--- производный класс Квадрат
class CSquare : public CShape // после двоеточия указывается базовый класс,
{ // от которого производится наследование
private:
int m_square_side; // сторона квадрата

public:
CSquare(){m_type=2;} // конструктор, тип равен 2
};

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

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

Синтаксис создания производного класса от уже существующего выглядит следующим образом:

class имя_класса :
(public | protected | private) opt имя_базового_класса
{
объявления членов
};

Одним из аспектов производного класса является видимость (открытость) его членов-наследников. Ключевые слова public, protected и private используются для указания того, насколько члены базового класса будут доступны из производного. Использование в заголовке производного класса ключевого класса public, следующего за двоеточием, означает, что защищенные и открытые (protected и public) члены базового класса CShape должны наследоваться как защищенные и открытые члены производного класса CCircle.

При создании производного класса в MQL4 по умолчанию используется наследование private, для структур - public.

Закрытые члены базового класса недоступны производному классу. Открытое наследование означает также, что производные классы (CCircle и CSquare) являются CShape. То есть, квадрат (CSquare) является фигурой (CShape), но фигура не обязательно должна быть квадратом.

Производный класс является модификацией базового класса; он наследует защищенные и открытые члены базового класса. Не могут только наследоваться конструкторы и деструкторы базового класса. Часто в производный класс добавляются новые члены в дополнение к членам базового класса.

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

При защищенном наследовании открытые и защищенные члены базового класса становятся защищенными членами производного класса. При закрытом наследовании открытые и защищенные члены базового класса становятся закрытыми членами производного класса.

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

Необходимо понимать, что тип наследования (public, protected или private) никак не влияет на способы доступа к членам базовых классов в иерархии наследования из потомка (наследника). При любом типе наследования из производных классов будут доступны только члены базового класса, объявленные со спецификаторами доступа public и protected. Рассмотрим вышесказанное на примере:

#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Класс-пример с несколькими типами доступа |
//+------------------------------------------------------------------+
class CBaseClass
{
private: //--- закрытый член недоступен из потомков
int m_member;
protected: //--- защищенный метод доступен из базового класса и его потомков
int Member(){return(m_member);}
public: //--- конструктор класса доступен всем
CBaseClass(){m_member=5;return;};
private: //--- закрытый метод для присвоения значения члену m_member
void Member(int value) { m_member=value;};

};
//+------------------------------------------------------------------+
//| Производный класс с ошибками |
//+------------------------------------------------------------------+
class CDerived: public CBaseClass // public наследование нужно указывать явно, для классов умолчанию используется private
{
public:
void Func() // определим в потомке функцию с обращениями к членам базового класса
{
//--- попытка модификации закрытого члена базового класса
m_member=0; // ошибка, закрытый член базового класса никому не доступен
Member(0); // ошибка, закрытый метод базового класса не доступен в потомках
//--- чтение члена базового класса
Print(m_member); // ошибка, закрытый член базового класса никому не доступен
Print(Member()); // нет ошибки, защищенный метод доступен из базового класса и его потомков
}
};

В приведенном примере класс CBaseClass имеет только один публичный метод – конструктор. Конструкторы вызываются автоматически при создании объекта класса. Поэтому извне никак нельзя обратиться ни к закрытому члену m_member, ни к защищенному методу Member(). Но при этом при открытом (public) наследовании метод Member() базового класса будет доступен из потомков.

При защищенном (protected) наследовании все члены базового класса с открытым и защищенным доступом становятся защищенными. Это означает, что если открытые члены-данные и методы базового класса были доступны извне, то при защищенном наследовании теперь они доступны только из классов самого потомка и его последующих производных классах.

//+------------------------------------------------------------------+
//| Класс-пример с несколькими типами доступа |
//+------------------------------------------------------------------+
class CBaseMathClass
{
private: //--- закрытый член недоступен из потомков
double m_Pi;
public: //--- получение и установка значения для m_Pi
void SetPI(double v){m_Pi=v;return;};
double GetPI(){return m_Pi;};
public: // конструктор класса доступен всем
CBaseMathClass() {SetPI(3.14); PrintFormat("%s",__FUNCTION__);};
};
//+------------------------------------------------------------------+
//| Производный класс, в котором нельзя уже изменить m_Pi |
//+------------------------------------------------------------------+
class CProtectedChildClass: protected CBaseMathClass // защищенное наследование
{
private:
double m_radius;
public: //--- открытые методы в потомке
void SetRadius(double r){m_radius=r; return;};
double GetCircleLength(){return GetPI()*m_radius;};
};
//+------------------------------------------------------------------+
//| Функция запуска скрипта |
//+------------------------------------------------------------------+
void OnStart()
{
//--- при создании потомка констурктор базового класса вызовется автоматически
CProtectedChildClass pt;
//--- укажем радиус
pt.SetRadius(10);
PrintFormat("Length=%G",pt.GetCircleLength());
//--- если раскомментировать строку ниже, то получим ошибку на этапе компиляции,так как метод SetPi() стал защищенным
// pt.SetPI(3);

//--- а теперь объявим переменную базового класса и попробуем задать константу Pi равной 10
CBaseMathClass bc;
bc.SetPI(10);
//--- посмотрим что получилось
PrintFormat("bc.GetPI()=%G",bc.GetPI());
}

В данном пример показано, что методы SetPI() и GetPI() в базовом классе CBaseMathClass являются открытыми и доступны для вызова из любого места программы. Но в то же время для его потомка CProtectedChildClass вызовы этих методов можно делать только из методов самого класса CProtectedChildClass или его потомков.

При закрытом (private) наследовании все члены базового класса с доступом public и protected становятся закрытыми, и при дальнейшем наследовании обращение к ним становится невозможным.

В MQL4 нет множественного наследования.

Смотри также

Структуры и классы


Полиморфизм

Справочник MQL4 / Основы языка / Объектно-ориентированное программирование / Полиморфизм

Полиморфизм

Полиморфизм – это возможность для объектов разных классов, связанных с помощью наследования, реагировать различным способом при обращении к одной и той же функции-элементу. Это помогает создавать универсальные механизмы, описывающие поведение не только базового класса, но и классов-потомков.

Продолжим разработку базового класса CShape, в котором определим функцию-член GetArea(), предназначенную для расчета площади фигуры. Во всех классах-потомках, произведенных наследованием от базового класса, мы переопределим эту функцию в соответствие с правилами расчета площади конкретной фигуры.

Для квадрата (класс CSquare) площадь вычисляется через стороны, для круга (класс CCircle) площадь выражается через радиус и так далее. Мы можем создать массив для хранения объектов типа CShape, в котором можно будет хранить как объект базового класса, так и всех его потомков. В дальнейшем мы можем вызывать одну и ту же функцию для любого элемента данного массива.

Пример:

//--- Базовый класс
class CShape
{
protected:
int m_type; // тип фигуры
int m_xpos; // X - координата точки привязки
int m_ypos; // Y - координата точки привязки
public:
void CShape(){m_type=0;}; // конструктор, тип равен нулю
int GetType(){return(m_type);};// возвращает тип фигуры
virtual
double GetArea(){return (0); }// возвращает площадь фигуры
};

Теперь все производные классы имеют функцию-член getArea(), которая возвращает нулевое значение. Реализация этой функции в каждом потомке будет отличаться.

//--- производный класс Круг
class CCircle : public CShape // после двоеточия указывается базовый класс,
{ // от которого производится наследование
private:
double m_radius; // радиус круга

public:
void CCircle(){m_type=1;}; // конструктор, тип равен 1
void SetRadius(double r){m_radius=r;};
virtual double GetArea(){return (3.14*m_radius*m_radius);}// площадь круга
};

Для квадрата объявление класса выглядит аналогично:

//--- производный класс Квадрат
class CSquare : public CShape // после двоеточия указывается базовый класс,
{ // от которого производится наследование
private:
double m_square_side; // сторона квадрата

public:
void CSquare(){m_type=2;}; // конструктор, тип равен 2
void SetSide(double s){m_square_side=s;};
virtual double GetArea(){return (m_square_side*m_square_side);}//площадь квадрата
};

Так как для вычисления площади квадрата и круга требуются соответствующие значения членов m_radius и m_square_side, то в объявлении соответствующего класса мы добавили функции SetRadius() и SetSide().

Предполагается, что в программе у нас используются объекты разного типа (CCircle и CSquare), но унаследованные от одного базового типа CShape. Полиморфизм позволяет нам создать массив объектов базового типа CShape, но при объявлении этого массива сами объекты еще неизвестны и их тип неопределен.

Решение о том, объект какого типа будет содержаться в каждом элементе массива, будет приниматься непосредственно при выполнении программы. Это подразумевает динамическое создание объектов соответствующих классов, и, следовательно, необходимость вместо самих объектов использовать указатели объектов.

Для динамического создания объектов используется оператор new, каждый такой объект нужно самостоятельно и явно удалять оператором delete. Поэтому мы объявим массив указателей типа CShape и для каждого его элемента создадим объект нужного типа (new Имя_класса), как это показано в примере скрипта:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- объявим массив указателей объектов базового типа
CShape *shapes[5]; // массив указателей на объекты CShape

//--- здесь заполняем массив производными объектами
//--- объявим указатель на объект типа CCircle
CCircle *circle=new CCircle();
//--- задаем свойства объекта по указателю circle
circle.SetRadius(2.5);
//--- поместим в shapes[0] значение указателя
shapes[0]=circle;

//--- создаем еще один объект CCircle и запишем его указатель в shapes[1]
circle=new CCircle();
shapes[1]=circle;
circle.SetRadius(5);

//--- тут мы намеренно "забыли" задать значение для shapes[2]
//circle=new CCircle();
//circle.SetRadius(10);
//shapes[2]=circle;

//--- для неиспользуемого элемента установим значение NULL
shapes[2]=NULL;

//--- создаем объект CSquare и запишем его указатель в shapes[3]
CSquare *square=new CSquare();
square.SetSide(5);
shapes[3]=square;

//--- создаем объект CSquare и запишем его указатель в shapes[4]
square=new CSquare();
square.SetSide(10);
shapes[4]=square;

//--- массив указателей есть, получим его размер
int total=ArraySize(shapes);
//--- пройдем в цикле по всем указателям в массиве
for(int i=0; i<5;i++)
{
//--- если по указанному индексу указатель является валидным
if(CheckPointer(shapes[i])!=POINTER_INVALID)
{
//--- выведем в лог тип и площадь фигуры
PrintFormat("Объект типа %d имеет площадь %G",
shapes[i].GetType(),
shapes[i].GetArea());
}
//--- если указатель имеет тип POINTER_INVALID
else
{
//--- сообщим об ошибке
PrintFormat("Объект shapes[%d] не инициализирован! Его указатель %s",
i,EnumToString(CheckPointer(shapes[i])));
}
}

//--- мы должны самостоятельно уничтожить все созданные динамические объекты
for(int i=0;i<total;i++)
{
//--- удалять можно только объекты, чей указатель имеет тип POINTER_DYNAMIC
if(CheckPointer(shapes[i])==POINTER_DYNAMIC)
{
//--- сообщим об удалении
PrintFormat("Удаляем shapes[%d]",i);
//--- уничтожим объект по его указателю
delete shapes[i];
}
}
}

Обратите внимание, что при уничтожении объекта оператором delete необходимо проверить тип его указателя. Удалять с помощью delete можно только объекты, имеющие указатель POINTER_DYNAMIC, для указателей другого типа будет получена ошибка.

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


Перегрузка

Справочник MQL4 / Основы языка / Объектно-ориентированное программирование / Перегрузка

Перегрузка

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

Если для вызываемой функции нет точного соответствия, то компилятор производит поиск подходящей функции по трем уровням последовательно:

  1. поиск среди методов класса;
  2. поиск среди методов базовых классов, последовательно от ближайшего предка до самого первого;
  3. поиск среди остальных функций.

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

Смотри также

Перегрузка функций


Виртуальные функции

Справочник MQL4 / Основы языка / Объектно-ориентированное программирование / Виртуальные функции

Виртуальные функции

Ключевое слово virtual служит спецификатором функции, который обеспечивает механизм для динамического выбора на этапе выполнения подходящей функции-члена среди функций базового и производного классов, структуры не могут иметь виртуальных функций. Оно может применяться для изменения объявлений только функций-членов.

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

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

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

Деструкторы всегда являются виртуальными, независимо от того, объявлены они с ключевым слово virtual или нет.

Внимание: Не рекомендуется вызывать виртуальные методы из конструкторов и деструкторов, потому что поведение программы в этих случаях неопределено.

Рассмотрим использование виртуальных функций на примере программы Tetris.mq5. Во включаемом файле TetisShape.mqh определен базовый класс CTetrisShape с виртуальной функцией Draw (рисовать).

//+------------------------------------------------------------------+
class CTetrisShape
{
protected:
int m_type;
int m_xpos;
int m_ypos;
int m_xsize;
int m_ysize;
int m_prev_turn;
int m_turn;
int m_right_border;
public:
void CTetrisShape();
void SetRightBorder(int border) { m_right_border=border; }
void SetYPos(int ypos) { m_ypos=ypos; }
void SetXPos(int xpos) { m_xpos=xpos; }
int GetYPos() { return(m_ypos); }
int GetXPos() { return(m_xpos); }
int GetYSize() { return(m_ysize); }
int GetXSize() { return(m_xsize); }
int GetType() { return(m_type); }
void Left() { m_xpos-=SHAPE_SIZE; }
void Right() { m_xpos+=SHAPE_SIZE; }
void Rotate() { m_prev_turn=m_turn; if(++m_turn>3) m_turn=0; }
virtual void Draw() { return; }
virtual bool CheckDown(int& pad_array[]);
virtual bool CheckLeft(int& side_row[]);
virtual bool CheckRight(int& side_row[]);
};

Далее для каждого производного класса эта функция реализована в соответствии с особенностями класса-потомка. Например, первая фигура CTetrisShape1 имеет свою реализацию функции Draw():

class CTetrisShape1 : public CTetrisShape
{
public:
//--- отрисовка фигуры
virtual void Draw()
{
int i;
string name;
//---
if(m_turn==0 || m_turn==2)
{
//--- горизонтальная палка
for(i=0; i<4; i++)
{
name=SHAPE_NAME+(string)i;
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
}
}
else
{
//--- вертикальная палка
for(i=0; i<4; i++)
{
name=SHAPE_NAME+(string)i;
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+i*SHAPE_SIZE);
}
}
}
}

Фигура квадрат описана классом CTetrisShape6 и имеет собственную реализацию метода Draw():

class CTetrisShape6 : public CTetrisShape
{
public:
//--- отрисовка фигуры
virtual void Draw()
{
int i;
string name;
//---
for(i=0; i<2; i++)
{
name=SHAPE_NAME+(string)i;
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
}
for(i=2; i<4; i++)
{
name=SHAPE_NAME+(string)i;
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+(i-2)*SHAPE_SIZE);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
}
}
};

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

void CTetrisField::NewShape()
{
//--- случайным образом создаём одну из 7 возможных фигур
int nshape=rand()%7;
switch(nshape)
{
case 0: m_shape=new CTetrisShape1; break;
case 1: m_shape=new CTetrisShape2; break;
case 2: m_shape=new CTetrisShape3; break;
case 3: m_shape=new CTetrisShape4; break;
case 4: m_shape=new CTetrisShape5; break;
case 5: m_shape=new CTetrisShape6; break;
case 6: m_shape=new CTetrisShape7; break;
}
//--- отрисовываем
m_shape.Draw();
//---
}


Статические члены класса

Справочник MQL4 / Основы языка / Объектно-ориентированное программирование / Статические члены класса

Статические члены класса/структуры

Статические члены

Члены класса могут быть объявлены с использованием модификатора класса памяти static. Такие члены данных разделяются всеми экземплярами данного класса и хранятся в одном месте. Нестатические члены данных создаются для каждой переменной-объекта класса.

Отсутствие возможности объявлять статически члены класса привело бы к необходимости объявлять эти данные на глобальном уровне программы. Это разорвало бы отношения между данными и их классом, а также не согласуется с основной парадигмой ООП – объединение в классе данных и методов для их обработки. Статический член позволяет данным класса, которые не специфичны для отдельного экземпляра, существовать в области видимости класса.

Так как статический член класса не зависит от конкретного экземпляра, то обращение к нему выглядит следующим образом:

class_name::variable

где class_name – это имя класса, а variable означает имя члена класса.

Как видите, для обращения к статическому члену класса используется оператор разрешения контекста ::. При обращении к статическому члену внутри методов класса оператор контекста необязателен.

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

Например, у нас есть класс CParser, предназначенный для синтаксического разбора текстов, и нам необходимо считать общее количество обработанных слов и символов. Достаточно объявить нужные члены класса статическими и инициализировать их на глобальном уровне. Тогда все экземпляры класса при работе будут использовать общие счетчики слов и символов.

//+------------------------------------------------------------------+
//| Класс "Анализатор текстов" |
//+------------------------------------------------------------------+
class СParser
{
public:
static int s_words;
static int s_symbols;
//--- конструктор и деструктор
CParser(void);
~CParser(void){};
};
...
//--- инициализация статических членов класса Parser на глобальном уровне
int CParser::s_words=0;
int CParser::s_symbols=0;

Статический член класса можно объявить с ключевым словом const. Такие статические константы должны быть инициализированы на глобальном уровне с ключевым словом const:

//+------------------------------------------------------------------+
//| Класс "Стек" для хранения обрабатываемых данных |
//+------------------------------------------------------------------+
class CStack
{
public:
CStack(void);
~CStack(void){};
...
private:
static const int s_max_length; // максимальная емкость стека
};

//--- инициализация статической константы класса CStack
const int CStack::s_max_length=1000;

Указатель this

Ключевое слово this обозначает объявленный неявно указатель на себя – на конкретный экземпляр класса, в контексте которого выполняется метод. Он может использоваться только в нестатических методах класса. Указатель this является неявным нестатическим членом любого класса.

В статических функциях можно обращаться только к статическим членам/методам класса.

Статические методы

В MQL4 разрешается использовать функции-члены типа static. Модификатор static должен идти перед возвращаемым типом функции в объявлении внутри класса.

class CStack
{
public:
//--- конструктор и деструктор
CStack(void){};
~CStack(void){};
//--- максимальная емкость стека
static int Capacity();
private:
int m_length; // количество элементов в стеке
static const int s_max_length; // максимальная емкость стека
};
//+------------------------------------------------------------------+
//| Возвращает максимальную вместимость стека |
//+------------------------------------------------------------------+
int CStack::Capacity(void)
{
return(s_max_length);
};
//--- инициализация статической константы класса CStack
const int CStack::s_max_length=1000;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- объявим переменную типа CStack
CStack stack;
//--- вызываем статический метод объекта
Print("CStack.s_max_length=",stack.Capacity());
//--- а можно и так вызвать, т.к. метод статический и не требует наличия объекта
Print("CStack.s_max_length=",CStack::Capacity());
}

Метод с модификатором const называется постоянным и не может модифицировать неявные члены своего класса. Объявление постоянных функций класса и постоянных параметров называется контролем постоянства (const-correctness). Благодаря такому контролю можно быть уверенным, что компилятор проследит за неизменностью значений объектов и выдаст ошибку еще на стадии компиляции в случае нарушения.

Модификатор const ставится после списка аргументов внутри объявления класса. Определение вне класса также должно включать модификатор const:

//+------------------------------------------------------------------+
//| Класс "Прямоугольник" |
//+------------------------------------------------------------------+
class CRectangle
{
private:
double m_width; // ширина
double m_height; // высота
public:
//--- конструкторы и деструктор
CRectangle(void):m_width(0),m_height(0){};
CRectangle(const double w,const double h):m_width(w),m_height(h){};
~CRectangle(void){};
//--- вычисление площади
double Square(void) const;
static double Square(const double w,const double h);// { return(w*h); }
};
//+------------------------------------------------------------------+
//| Возвращает площадь объекта "Прямоугольник" |
//+------------------------------------------------------------------+
double CRectangle::Square(void) const
{
return(Square(m_width,m_height));
}
//+------------------------------------------------------------------+
//| Возвращает произведение двух переменных |
//+------------------------------------------------------------------+
static double CRectangle::Square(const double w,const double h)
{
return(w*h);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- создадим прямоугольник rect со сторонами 5 и 6
CRectangle rect(5,6);
//--- выведем площадь прямоугольника константным методом
PrintFormat("rect.Square()=%.2f",rect.Square());
//--- выведем произведние чисел с помощью статического метода класса CRectangle
PrintFormat("CRectangle::Square(2.0,1.5)=%f",CRectangle::Square(2.0,1.5));
}

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

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

Смотри также

Статические переменные, Переменные, Ссылки. Модификатор & и ключевое слово this


Шаблоны функций

Справочник MQL4 / Основы языка / Объектно-ориентированное программирование / Шаблоны функций

Шаблоны функций

Перегруженные функции обычно используются для выполнения похожих операций над различными типами данных. Простой пример такой функции в MQL4 - ArraySize(), которая возвращает размер массива любого типа. На самом деле эта системная функция является перегруженной, и вся реализация такой перегрузки спрятана от разработчика программ на MQL4:

int ArraySize(
void& array[] // проверяемый массив
);

То есть на самом деле компилятор языка MQL4 подставляет для каждого вызова этой функции нужную реализацию, например, для массивов целого типа примерно так:

int ArraySize(
int& array[] // массив с элементами типа int
);

А для массива типа MqlRates для работы с котировками в формате исторических данных функцию ArraySize() можно представить таким образом:

int ArraySize(
MqlRates& array[] // массив, заполненный значениями типа MqlRates
);

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

Есть более удобное решение – если для каждого типа данных должны выполняться идентичные операции, то более компактным и удобным решением является использование шаблонов функций. При этом программисту нужно написать всего одно описание шаблона функции. При таком описании шаблона в качестве параметра достаточно указать не конкретный тип данных, с которыми должна работать функция, а некий формальный параметр. Основываясь на типах аргументов, использованных при вызове этой функции, компилятор будет автоматически генерировать разные функции для соответствующей обработки каждого типа.

Определение шаблона функции начинается с ключевого слова template, после которого в угловых скобках идет список формальных параметров. Каждый формальный параметр предваряется ключевым словом typename. Формальные типы параметров – встроенные типы или типы, определенные пользователем. Они используются:

  • для задания типов аргументов функции,
  • для задания типов возвращаемого значения функции,
  • для объявления переменных внутри тела описания функции

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

Вот пример шаблона функции для поиска максимального значения в массиве любого числового типа (целые и вещественные числа):

template<typename T>
T ArrayMax(T &arr[])
{
uint size=ArraySize(arr);
if(size==0) return(0);

T max=arr[0];
for(uint n=1;n<size;n++)
if(max<arr[n]) max=arr[n];
//---
return(max);
}

Данный шаблон описывает функцию, которая находит максимальное значение в переданном массиве и возвращает его в качестве результата. Напомним, что встроенная в MQL4 функция ArrayMaximum() возвращает только индекс найденного максимального значения, по которому пользователь в дальнейшем может получить уже и само значение. Например, так:

//--- создадим массив
double array[];
int size=50;
ArrayResize(array,size);
//--- заполним случайными значениями
for(int i=0;i<size;i++)
{
array[i]=MathRand();
}

//--- найдем позицию максимального элемента в массиве
int max_position=ArrayMaximum(array);
//--- теперь получим само максимальное значение в массиве
double max=array[max_position];
//--- вывод найденного значения
Print("Max value = ",max);

Таким образом, нам понадобилось два действия, чтобы получить максимальное значение в массиве. С помощью шаблона функции ArrayMax() можно получить результат нужного типа, просто передав в неё массив соответствующего типа. То есть вместо двух последних строчек

//--- найдем позицию максимального элемента в массиве
int max_position=ArrayMaximum(array);
//--- теперь получим само максимальное значение в массиве
double max=array[max_position];

теперь мы можем использовать одну строку, возвращающую сразу результат того же типа, что и переданный массив:

//--- найдем максимальное значение
double max=ArrayMax(array);

При этом тип результата, возвращенный функцией ArrayMax(), будет автоматически соответствовать типу массива.

Для создания универсальных способов работы с различными типами данных необходимо использовать ключевое слово typename для получения типа аргумента в виде строки. Покажем это на примере функции, которая возвращает в виде строки тип данных:

#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnStart()
{
//---
CTrade trade;
double d_value=M_PI;
int i_value=INT_MAX;
Print("d_value: type=",GetTypeName(d_value), ", value=", d_value);
Print("i_value: type=",GetTypeName(i_value), ", value=", i_value);
Print("trade: type=",GetTypeName(trade));
//---
}
//+------------------------------------------------------------------+
//| Возвращает в строковом виде тип |
//+------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T &t)
{
//--- вернем тип в виде строки
return(typename(T));
//---
}

Шаблоны функций можно также использовать и для методов класса, например:

class CFile
{
...
public:
...
template<typename T>
uint WriteStruct(T &data);
};

template<typename T>
uint CFile::WriteStruct(T &data)
{
...
return(FileWriteStruct(m_handle,data));
}

Шаблоны функций нельзя объявлять с ключевыми словами export, virtual и #import.

Перегрузка шаблонных функций

В некоторых случаях может понадобиться перегрузка шаблонной функции. Например, у нас есть шаблонная функция, которая записывает в первый параметр значение второго параметра с помощью явного приведения типов. В языке MQL5 запрещено приведение типа string к типу bool, мы можем сделать это сами – для этого создадим перегрузку шаблонной функции. Например:

//+------------------------------------------------------------------+
//| Шаблонная функция |
//+------------------------------------------------------------------+
template<typename T1,typename T2>
string Assign(T1 &var1,T2 var2)
{
var1=(T1)var2;
return(__FUNCSIG__);
}
//+------------------------------------------------------------------+
//| Специальная перегрузка для случая bool+string |
//+------------------------------------------------------------------+
string Assign(bool &var1,string var2)
{
var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0);
return(__FUNCSIG__);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int i;
bool b;
Print(Assign(i,"test"));
Print(Assign(b,"test"));
}

В результате выполнения данного кода мы увидим, что для пары int+string была использована шаблонная функция Assign(), а при втором вызове для пары bool+string уже иcпользовалась перегруженная версия.

string Assign<int,string>(int&,string)
string Assign(bool&,string)

Смотри также

Перегрузка


Шаблоны классов

Справочник MQL4 / Основы языка / Объектно-ориентированное программирование / Шаблоны классов

Чем хороши шаблоны

Шаблоны функций используются в тех случаях, когда необходимо производить одинаковые операции с данными разного типа, например – поиск максимального элемента в массиве. Главное преимущество использования шаблонов заключается в том, что программисту нет необходимости писать отдельную перегрузку для каждого типа. То есть вместо объявления множества перегрузок для каждого типа

double ArrayMax(double array[])
{
...
}
int ArrayMax(int array[])
{
...
}
uint ArrayMax(uint array[])
{
...
}
long ArrayMax(long array[])
{
...
}
datetime ArrayMax(datetime array[])
{
...
}

достаточно написать одну шаблонную функцию

template<typename T>
T ArrayMax(T array[])
{
if(ArraySize()==0)
return(0);
uint max_index=ArrayMaximum(array);
return(array[max_index]);
}

и затем использовать её в своем коде:

double high[];
datetime time[];
....
double max_high=ArrayMax(high);
datetime lasttime=ArrayMax(time);

Здесь формальный параметр T, который задает тип используемых данных, при компиляции заменяется на реально используемый тип, то есть компилятор автоматически генерирует отдельную функцию под каждый тип – double, datetime и так далее. Точно также в языке MQL5 можно создавать шаблоны классов, используя все преимущества такого подхода.

Шаблоны классов

Шаблон класса объявляется с помощью ключевого слов template, за которым идут угловые скобки <>, в которых перечисляется список формальных параметров с ключевым словом typename. Такая запись указывает компилятору, что перед ним обобщенный класс с формальным параметром T, задающим реальный тип переменной при реализации класса. Например, создадим класс-вектор для хранения массива с элементами типа T:

#define TOSTR(x) #x+" " // макрос для вывода имени объекта
//+------------------------------------------------------------------+
//| Класс-вектор для хранения элементов типа T |
//+------------------------------------------------------------------+
template <typename T>
class TArray
{
protected:
T m_array[];
public:
//--- конструктор по умолчанию создает массив на 10 элементов
void TArray(void){ArrayResize(m_array,10);}
//--- конструктор для создания вектора с заданным размером массива
void TArray(int size){ArrayResize(m_array,size);}
//--- возвращает тип и количество данных, которые хранятся в объекте типа TArray
string Type(void){return(typename(m_array[0])+":"+(string)ArraySize(m_array));};
};

Далее, в программе создадим разными способами три объекта TArray для работы с разными типами

void OnStart()
{
TArray<double> double_array; // вектор имеет размер по умолчанию 10
TArray<int> int_array(15); // вектор имеет размер 15
TArray<string> *string_array; // указатель на вектор TArray<string>
//--- создадим динамический объект
string_array=new TArray<string>(20);
//--- выведем в Журнал имя объекта, тип данных и размер вектора
PrintFormat("%s (%s)",TOSTR(double_array),double_array.Type());
PrintFormat("%s (%s)",TOSTR(int_array),int_array.Type());
PrintFormat("%s (%s)",TOSTR(string_array),string_array.Type());
//--- удалим динамический объект перед завершением программы
delete(string_array);
}

Результат выполнения скрипта:

double_array (double:10)
int_array (int:15)
string_array (string:20)

В результате было создано 3 вектора с разными типами данных: double, int и string.

Шаблоны классов хорошо подходят для разработки контейнеров – объектов, которые предназначены для инкапсуляции объектов любого типа. Объектами контейнеров являются коллекции, которые уже содержат объекты одного определенного типа. Как правило в контейнер сразу же встраивается и реализация по работе с данными, которые в нём хранятся.

Например, можно создать шаблон класса, который не позволяет обратиться к элементу за пределами массива, и таким образом избегать критической ошибки "out of range".

//+------------------------------------------------------------------+
//| Класс для безопасного обращения к элементу массива |
//+------------------------------------------------------------------+
template<typename T>
class TSafeArray
{
protected:
T m_array[];
public:
//--- конструктор по умолчанию
void TSafeArray(void){}
//--- конструктор для создания массива заданного размера
void TSafeArray(int size){ArrayResize(m_array,size);}
//--- размер массива
int Size(void){return(ArraySize(m_array));}
//--- изменение размера массива
int Resize(int size,int reserve){return(ArrayResize(m_array,size,reserve));}
//--- освобождение массива
void Erase(void){ZeroMemory(m_array);}
//--- оператор доступа к элементу массива по индексу
T operator[](int index);
//--- оператор присваивания для получения сразу всех элементов из массива
void operator=(const T &array[]); // массив типа T
};
//+------------------------------------------------------------------+
//| Операция получения элемента по индексу |
//+------------------------------------------------------------------+
template<typename T>
T TSafeArray::operator[](int index)
{
static T invalid_value;
//---
int max=ArraySize(m_array)-1;
if(index<0 || index>=ArraySize(m_array))
{
PrintFormat("%s index %d is not in range (0-%d)!",__FUNCTION__,index,max);
return(invalid_value);
}
//---
return(m_array[index]);
}
//+------------------------------------------------------------------+
//| Операция присваивания для массива |
//+------------------------------------------------------------------+
template<typename T>
void TSafeArray::operator=(const T &array[])
{
int size=ArraySize(array);
ArrayResize(m_array,size);
//--- тип T должен поддерживать оператор копирования
for(int i=0;i<size;i++)
m_array[i]=array[i];
//---
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int copied,size=15;
MqlRates rates[];
//--- скопируем массив котировок
if((copied=CopyRates(_Symbol,_Period,0,size,rates))!=size)
{
PrintFormat("CopyRates(%s,%s,0,%d) вернула код ошибки %d",
_Symbol,EnumToString(_Period),size,GetLastError());
return;
}
//--- создадим контейнер и вложим в него массив значений MqlRates
TSafeArray<MqlRates> safe_rates;
safe_rates=rates;
//--- индекс в пределах массива
int index=3;
PrintFormat("Close[%d]=%G",index,safe_rates[index].close);
//--- индекс за пределами массива
index=size;
PrintFormat("Close[%d]=%G",index,safe_rates[index].close);
}

Обратите внимание, что при описании методов за пределами декларации класса также необходимо использовать объявление шаблона:

template<typename T>
T TSafeArray::operator[](int index)
{
...
}
template<typename T>
void TSafeArray::operator=(const T &array[])
{
...
}

Шаблоны классов и функций позволяют указывать несколько формальных параметров через запятую, например, коллекция Map для хранения пар "ключ – значение":

template<typename Key, template Value>
class TMap
{
...
}

Смотри также

Шаблоны функций, Перегрузка


Абстрактные классы

Справочник MQL4 / Основы языка / Объектно-ориентированное программирование / Абстрактные классы

Абстрактные классы и чисто виртуальные функции

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

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

Виртуальная функция объявляется как "чистая" с помощью синтаксиса спецификатора-чистоты. Рассмотрим в качестве примера класс CAnimal, который создаётся только для того, чтобы предоставлять общие функции – сами объекты типа CAnimal имеют слишком общий характер для практического применения. Таким образом, класс CAnimal является хорошим кандидатом в абстрактный класс:

class CAnimal
{
public:
CAnimal(); // конструктор
virtual void Sound() = 0; // чисто виртуальная функция
private:
double m_legs_count; // количество ног животного
};

Здесь функция Sound() является чисто виртуальной, потому что она объявлена со спецификатором чисто виртуальной функции PURE (=0).

Чисто виртуальными функциями являются только такие виртуальные функции, для которых указан спецификатор чистоты PURE, а именно: (=NULL) или (=0). Пример объявления и использования абстрактного класса:

class CAnimal
{
public:
virtual void Sound()=NULL; // PURE method, должен быть переопределён в потомке, сам класс CAnimal стал абстрактным и не может быть создан
};
//--- потомок от абстрактного класса
class CCat : public CAnimal
{
public:
virtual void Sound() { Print("Myau"); } // PURE переопределён, класс CCat не абстрактный и может быть создан
};

//--- примеры неправильного использования
new CAnimal; // ошибка 'CAnimal' - компилятор выдаст ошибку "cannot instantiate abstract class"
CAnimal some_animal; // ошибка 'CAnimal' - компилятор выдаст ошибку "cannot instantiate abstract class"

//--- примеры правильного использования
new CCat; // ошибки нет - класс CCat не абстрактный
CCat cat; // ошибки нет - класс CCat не абстрактный

Ограничения на использование абстрактных классов

При вызове конструктором абстрактного класса чистой виртуальной функции (прямо или косвенно) результат будет неопределённым.

//+------------------------------------------------------------------+
//| Абстрактный базовый класс |
//+------------------------------------------------------------------+
class CAnimal
{
public:
//--- чисто виртуальная функция
virtual void Sound(void)=NULL;
//--- функция
void CallSound(void) { Sound(); }
//--- конструктор
CAnimal()
{
//--- явный вызов виртуального метода
Sound();
//--- неявный вызов (через третью функцию)
CallSound();
//--- в конструкторе и/или деструкторе всегда вызываются свои функции,
//--- несмотря на виртуальность и переопределение вызываемой функции в потомке
//--- если вызываемая функция чисто виртуальная, то
//--- вызов приведёт к критической ошибке выполнения: "pure virtual function call"
}
};

Однако конструкторы и деструкторы абстрактных классов могут вызывать другие функции-члены.


Обновленный MQL4

Справочник MQL4 / Основы языка / Обновленный MQL4

Что нового в MQL4

Начиная с билда 600 язык программирования MQL4 полностью переработан и достиг уровня MQL5 - теперь писать торговых роботов на MQL4/MQL5 можно в единой среде разработке MetaEditor и используя единые стиль, библиотеки и инструменты отладки.

MQL4 пользуется заслуженной популярностью среди разработчиков автоматических торговых систем благодаря простоте изучения и огромному количеству кода, наработанного за многие годы использования терминала MetaTrader 4. Но вместе с тем, ему были присущи и некоторые недостатки, проистекающие из главного преимущества - простой язык программирования не позволял писать сложные системы и затруднял портирование отлаженных библиотек из языков высокого уровня. Поэтому мы решили перенести в него максимум функций и возможностей языка MQL5, полностью сохраняя функционал MQL4. То есть все мощные функции MQL5, включая ООП и компилятор в нативный код, станут доступны в MQL4.

Для этого мы разработали единый компилятор, который автоматически поддерживает оба языка MQL4 и MQL5. MetaEditor тоже становится единым для обеих платформ MetaTrader 4 и MetaTrader 5. С его помощью можно компилировать как MQL4, так и MQL5 из любой версии. Для работы также сразу становится доступным и MQL5 Storage.

Защита MQL4-программ поднимается на один уровень с MQL5, в новых EX4/EX5-файлах очень серьезная и полностью переработанная защита по сравнению со старым EX4. А это значит, что для MetaTrader 4 становится доступным и Маркет защищенных приложений на EX4.

Кроме того, в язык MQL4 добавлены новые графические объекты и новые функции по работе с графиками. Стандартная библиотека из MQL5 портирована и в MQL4, что предоставило для разработчиков программ новые возможности по созданию собственных графических интерфейсов и торговых библиотек. Теперь в MetaTrader 4 можно создавать полноценные приложения с использованием ресурсов.

Изменения в языке MQL4

Добавлены новые типы данных char, short, long, uchar, ushort, uint, ulong и double. Это позволит легко переносить коды из других C++ подобных языков. Данные разного типа обрабатываются с разной скоростью. Целочисленные данные обрабатываются быстрее всего. Для обработки данных двойной точности используется специальный сопроцессор. Однако из-за сложности внутреннего представления данных с плавающей точкой они обрабатывается дольше, чем целочисленные. Введена операция приведения типов.

Строки теперь представлены в формате Unicode, раньше они были в формате ANSI (однобайтовые). Это необходимо учитывать, если программа использует DLL и передает в них строковые переменные.

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

Добавлены структуры и классы, указатели объектов, тип void и ключевое слово this для получения объектом ссылки на самого себя. Поддерживаются все стандарты объектно-ориентированного программирования:

  • Инкапсуляция и расширяемость типов
  • Наследование
  • Полиморфизм
  • Перегрузка
  • Виртуальные функции

ООП позволяет писать программы с использованием классов, что облегчает отладку и разработку больших программ, позволяет многократно использовать наработки благодаря наследованию. Но это не означает, что теперь нельзя писать на MQL4 в процедурном стиле, как это было раньше. Вы можете писать свои программы как и раньше, если вам не нужны новые возможности.

Предопределенные функции init(), deinit() и start() остались для совместимости, но вместо них теперь можно использовать OnInit(), OnDeinit(), OnStart(), OnCalculate(), OnTick(). Кроме того, добавились новые предопределенные функции-обработчики OnTimer(), OnChartEvent(), OnTester(). В старом MQL4 предопределенные функции могли иметь любые параметры и любой тип возврата, вызов этих функций осуществлялся не по сигнатуре, а по имени. В новом MQL4 все предопределенные функции должны точно соответствовать своим сигнатурам, то есть иметь четко определенный состав параметров и тип возврата.

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

Приоритет операций теперь приведен к стандартам языка Cи. В старых программах MQL4 для надежности вы можете расставить круглые скобки для явного указания приоритета, если не уверены.

В логических операциях теперь используется укороченная проверка условия. В старой версии MQL4 вычислялись все выражения, и только потом производилась проверка условия. Например, пусть есть проверка двух условий с использованием логического И:

if(condition1 && condition2)
{
// некоторый блок операций
}

Если выражение condition1 окажется равным false, то вычисление выражения condition2 проводиться уже не будет, так как результат false && true все равно будет равен false.

Изменилось поведение функции ArrayCopyRates() — в старой версии MQL4 эта функция производила копирование ценовых серий в массив double[][6]. Теперь для получения таймсерий необходимо использовать массив из элементов структуры MqlRates:

//--- Структура для хранения информации о ценах, объемах и спреде.
struct MqlRates
{
datetime time; // время начала периода
double open; // цена открытия
double high; // наивысшая цена за период
double low; // наименьшая цена за период
double close; // цена закрытия
long tick_volume; // тиковый объем
int spread; // спред
long real_volume; // биржевой объем
};

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

int ArrayCopyRates(
MqlRates& rates_array[], // массив MqlRates, переданный по ссылке
string symbol=NULL, // инструмент
int timeframe=0 // таймфрейм
);

Для совместимости со старыми MQL4 программами сохранился и старый формат вызова, но теперь производится реальное копирование данных в массив типа double.

int ArrayCopyRates(
void& dest_array[][], // массив, переданный по ссылке
string symbol=NULL, // инструмент
int timeframe=0 // таймфрейм
);

Это означает, что при изменении значений в таймсерии (добавлении новых баров, перестройке, обновлении цены Close последнего бара), необходимо заново скопировать нужные данные в массив dest_array[][]. При этом массив-приемник будет автоматически распределен под требуемое количество копируемых баров, даже если он был объявлен статически.

Изменился формат хранения исторических данных RateInfo. В старой версии состав структуры RateInfo был представлен таким образом:

struct RateInfo
{
unsigned int ctm; // дата открытия бара
double open; // цена открытия
double low; // минимальная цена бара
double high; // максимальная цена бара
double close; // цена закрытия
double vol; // объем
};

В новом формате в структура RateInfo добавлены поля для хранения спреда и торгового объема:

//--- Стандартное представление котировки в новой версии терминала
struct RateInfo
{
INT64 ctm; // дата и время открытия
double open; // цена открытия (абсолютное значение)
double high; // минимальная цена бара
double low; // максимальная цена бара
double close; // цена закрытия
UINT64 vol; // тиковый объём
INT32 spread; // спред
UINT64 real; // торговый объём
};

Соответственно, если в программах MQL4 используются DLL для передачи/приема ценовых данных, то соответствующие функции в исходных кодах должны быть переписаны и заново скомпилированы с учетом изменении формата для обеспечения правильной работы.

Старые EX4 программы и DLL, основанные на старом формате RateInfo, работать в новом терминале не будут. Требуется приведение к новому формату.

В файловых операциях количество одновременно открытых файлов теперь может достигать 64, в старом MQL4 было не более 32. При этом раньше файлы всегда открывались в режиме FILE_SHARE_READ, FILE_SHARE_WRITE, теперь желательный режим открытия нужно указывать явно.

Для функций FileWrite(), FileWriteArray(), FileWriteDouble(), FileWriteInteger() и FileWriteString() изменен тип возвращаемого значения с int на uint. Данные функции возвращают количество записанных байт или 0 в случае ошибки (в старой версии MQL4 в случае ошибки возвращалось отрицательное число).

Изменилась также работа с функциями, областью видимости переменных и освобождением памяти в локальных массивах. Так как изменений оказалось достаточно много, то для обеспечения максимальной совместимости со старым подходом к написанию программ MQL4 было решено ввести новое свойство #property strict. При создании новой программы MQL4 с помощью Мастера MQL4 это свойство всегда добавляется в шаблон.

Следует иметь ввиду, что преобразование типа datetime в строку теперь зависит от режима компиляции:

datetime date=D'2014.03.05 15:46:58';
string str="mydate="+date;
//--- str="mydate=1394034418" - старый компилятор, новый компилятор без директивы #property strict
//--- str="mydate=2014.03.05 15:46:58" - новый компилятор с директивой #property strict

Ниже в таблице перечислены все различия между старым MQL4, новым MQL4 без использования strict и новым MQL4 с указанием строгого режима компиляции:

#property strict

При компиляции библиотек в режиме strict для каждой экспортируемой функции необходимо добавлять модификатор export. в противном случае функция не будет доступна извне.

Таблица отличий между компиляторами:

Старый компилятор MQL4 | Новый компилятор MQL4 | Новый компилятор MQL4 с #property strict
Точки входа init(), start(), deinit() могут иметь любые параметры и любой тип возврата | init(), start(), deinit(), оставленные для совместимости, и новые OnInit(), OnStart(), OnCalculate(), OnTick(), OnTimer(), OnChartEvent(), OnTester(), OnDeinit() должны точно соответствовать своим сигнатурам | То же
Результат возврата из функции init() никак не анализируется исполняющей подсистемой | Результат возврата из функций init() и OnInit() никак не анализируется исполняющей подсистемой | При возврате из OnInit() ненулевого значения выполнение эксперта или индикатора прекращается, программа выгружается
Имена переменных практически любые (кроме зарезервированных слов), включая спецсимволы и точки | Имена переменных не могут иметь спецсимволы и точки. Список зарезервированных слов расширен, поэтому именами не могут быть такие широко распространенные слова, как short, long, const и т.д. | То же
Область видимости переменной - от объявления (даже во вложенном блоке) до конца функции | То же | Область видимости переменной - от объявления до конца блока, в котором переменная объявлена
Неявная инициализация всех переменных (и глобальных и локальных) нулями | То же | Инициализация только глобальных переменных. Из локальных переменных неявно инициализируются только строки
Локальные массивы при выходе из функции не освобождаются | Локальные массивы освобождаются при выходе из функции | Локальные массивы освобождаются при выходе из блока {}
Ошибка "Array out of range" (индекс за пределами массива) не приводит к критической ошибке* | То же. Кроме массивов структур и классов, для которых эта ошибка является критической | "Array out of range" - критическая ошибка и приводит к остановке программы
Структур и классов нет | Структуры и классы есть. Появились дополнительные типы данных | То же
Строки - однобайтовые. datetime - 32-битное целое Предопределенная переменная Volume имеет тип double | Строки - юникодные. datetime - 64-битное целое Предопределенная переменная Volume имеет тип long | То же
ArrayCopyRates() производит виртуальное копирование в массив double[][6] | ArrayCopyRates() производит виртуальное копирование в массив MqlRates[]. Для совместимости осталось копирование в массив double[][6], но это копирование не виртуальное, а реальное. | То же
Функции могут не возвращать значения, даже если они имеют тип. Для этого в конце функции компилятором автоматически проставляется return(0) | То же | Функции любого типа всегда должны возвращать значение
Количество одновременно открытых файлов - 32 | Количество одновременно открытых файлов - 64 | То же
Файлы всегда открываются в режиме совместного использования ** | Режим совместного использования нужно указывать явно с помощью FILE_SHARE_READ и/или FILE_SHARE_WRITE | То же
Для скриптов в окне входных параметров показываются имена extern переменных | Для скриптов в режиме show_inputs в окне входных параметров показываются имена extern и input-переменных | Для скриптов в режиме show_inputs в окне входных параметров показываются строчные комментарии вместо имен extern- и input-переменных

* Следует обратить особое внимание на ошибку "Array out of range" - многие старые пользовательские индикаторы при запуске на графике будут выдавать эту ошибку в новом компиляторе в режиме strict. Желательно найти причину и устранить её.

** В новом MQL4 и MQL5 за режим совместного использования файлов отвечают флаги FILE_SHARE_READ и FILE_SHARE_WRITE, которых не было в старом MQL4.

Изменения в файловой структуре

В предыдущих билдах клиентского терминала MetaTrader 4 (509 и ниже) все MQL4 программы хранились в корневой папке <каталог_установки_терминала>\experts\ в следующих подпапках:

  • \experts - эксперты (торговые роботы),
  • \experts\indicators - пользовательские индикаторы,
  • \experts\scripts - скрипты (программы на MQL4 для однократного выполнения на графике),
  • \include - включаемые в другие программы файлы исходного кода с расширением MQH и MQ4,
  • \libraries - библиотеки в виде исходного кода MQ4 и скомпилированные из них исполняемые файлы EX4, для динамического вызова собранных в них функций другими MQL4-программами,
  • \files - специальная "файловая песочница", только в пределах этой папки MQL4 программам разрешается выполнять файловые операции.

В новой версии MQL4 файловая структура для хранения исходных кодов изменилась. Теперь все программы на MQL4 должны находиться в папке <каталог_данных>\MQL4\ во вложенных соответствующих папках:

  • \Experts - эксперты (торговые роботы),
  • \Indicators - пользовательские индикаторы,
  • \Scripts - скрипты (программы на MQL4 для однократного выполнения на графике),
  • \Include - включаемые в другие программы файлы исходного кода с расширением MQH и MQ4,
  • \Libraries - библиотеки в виде исходного кода MQ4 и скомпилированные из них исполняемые файлы EX4, для динамического вызова собранных в них функций другими MQL4-программами,
  • \Images - файлы картинок для использования в ресурсах,
  • \Files - специальная "файловая песочница", только в пределах этой папки MQL4 программам разрешается выполнять файловые операции.

При обновлении терминала MetaTrader 4 с 509 билда на новую версию все файлы MQ4, MQH и EX4 из стандартных корневых папок старого местоположения автоматически копируются и раскладываются в соответствующие папки. Дополнительно созданные пользователем внутри стандартных папок дочерние папки с файлами никак не обрабатываются, их необходимо самостоятельно скопировать в новое место, если они необходимы.

Никакие файлы или папки при обновлении не удаляются! Все операции по копированию файлов при обновлении записываются в Журнал терминала с указанием подробных путей.

При обновлении автоматическая перекомпиляция старых EX4-файлы на новую версию не производится, пользователю предоставлена возможность самому решать какие исходные коды он хочет скомпилировать в новую версию EX4. Все старые EX4 будут работать и в новом терминале MetaTrader 4. Библиотеки EX4, скомпилированные новым компилятором, могут вызываться только из программ EX4, также скомпилированных в новой версии.

Возможно, в некоторых случаях в исходных файлах потребуется исправить пути в #include для включаемых файлов (если относительные пути изменились). Важно запомнить, что сейчас корневой папкой для редактора MetaEditor является папка <каталог_данных>\MQL4\, все программы должны находиться в правильных дочерних подпапках.

Найти каталог данных (<каталог_данных>) на компьютере для каждой копии установленного терминала MetaTrader 4 можно из меню терминала или редакторе MetaEditor: "Файл" - "Открыть каталог данных".


Константы, перечисления и структуры

Справочник MQL4 / Константы, перечисления и структуры

Стандартные константы, перечисления и структуры

Для облегчения написания программ, а также для удобства восприятия исходных текстов программ, в языке MQL4 предусмотрены предопределенные стандартные константы и перечисления. Кроме того, для хранения информации используются служебные структуры.

Стандартные константы являются аналогом макроподстановок и имеют тип int.

Константы сгруппированы по своему назначению:

  • Константы графиков используются при работе с ценовыми графиками: открытие, навигация, установка параметров;
  • Константы объектов предназначены для обработки графических объектов, которые можно создавать и отображать на графиках;
  • Константы индикаторов служат для работы со стандартными и пользовательскими индикаторами;
  • Состояние окружения – описывают свойства mql4-программы, предоставляют информацию о клиентском терминале, торговом инструменте и текущем торговом счете;
  • Торговые константы позволяют уточнять разнообразную информацию в процессе торговли;
  • Именованные константы – константы языка MQL4;
  • Структуры данных описывают используемые форматы хранения данных;
  • Коды ошибок и предупреждений описывают сообщения компилятора и сообщения торгового сервера на торговые запросы;
  • Константы ввода/вывода предназначены для работы с файловыми функциями и вывода сообщений на экран компьютера функцией MessageBox().


Константы графиков

Справочник MQL4 / Константы, перечисления и структуры / Константы графиков

Константы графиков

Константы, описывающие различные свойства графиков, разделены на следующие группы:

  • Типы событий – события, которые возникают при работе с графиком;
  • Периоды графиков – стандартные встроенные периоды;
  • Свойства графиков – идентификаторы, используемые в качестве параметров функций для работы с графиками;
  • Константы позиционирования - значения параметра функции ChartNavigate();
  • Отображение графиков - задание внешнего вида графика.

Что нового в MQL5

В платформе пятого поколения в 2 разa больше таймфреймов (21 против 9), добавлены новые графические объекты и аналитические инструменты. Точки объектов могут быть расположены в любой позиции между барами графика с точностью до минуты. При этом при переключении между таймфреймами сохраняется точное позиционирование контрольных точек объекта.

Прямо из MQL5-программы можно задавать любые свойства графиков – их количество расширено. Среди наиболее интересных CHART_SHOW и CHART_IS_DOCKED, которые позволяют открепить и вынести за пределы терминала любой график, превратив его тем самым в полноценную самостоятельную торговую панель. Отключите на графике показ ненужных областей, поместите на него объекты OBJ_CHART, индикаторы и советника – и вы получите собственный центр управления торговли со всеми нужными инструментами теханализа.

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

Идентификатор

Описание

Тип свойства

CHART_SHOW

Признак отрисовки ценового графика. Если установлено значение false, то отключается отрисовка любых атрибутов ценового графика и устраняются все отступы по краям графика: шкалы времени и цены, строка быстрой навигации, метки событий Календаря, значки сделок, тултипы индикаторов и баров, подокна индикаторов, гистограммы объёмов и т.д.

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

Графические объекты отрисовываются всегда независимо от установленного значения свойства CHART_SHOW.

bool

CHART_IS_OBJECT

Признак идентификации объекта "График" (OBJ_CHART) – для графического объекта возвращает true. Для настоящего графика значение равно false

bool r/o

CHART_CONTEXT_MENU

Включение/отключение доступа к контекстному меню по нажатию правой клавиши мышки.

Значение CHART_CONTEXT_MENU=false отключает только контекстное меню графика, при этом контекстное меню для объектов на графике остается доступным.

bool (значение по умолчанию true)

CHART_CROSSHAIR_TOOL

Включение/отключение доступа к инструменту "Перекрестие" по нажатию средней клавиши мышки

bool (значение по умолчанию true)

CHART_MOUSE_SCROLL

Прокрутка графика левой кнопкой мышки по горизонтали. Прокрутка по вертикали также будет доступна, если установлено в true значение любого из трех свойств: CHART_SCALEFIX, CHART_SCALEFIX_11 или CHART_SCALE_PT_PER_BAR

При CHART_MOUSE_SCROLL=false прокрутка графика колёсиком мышки будет недоступна

bool

CHART_EVENT_MOUSE_WHEEL

Отправка всем mql5-программам на графике сообщений о событиях колёсика мышки (CHARTEVENT_MOUSE_WHEEL)

bool (значение по умолчанию true)

CHART_EVENT_MOUSE_MOVE

Отправка всем mql5-программам на графике сообщений о событиях перемещения и нажатия кнопок мышки (CHARTEVENT_MOUSE_MOVE)

bool

CHART_EVENT_OBJECT_CREATE

Отправка всем mql5-программам на графике сообщений о событии создания графического объекта (CHARTEVENT_OBJECT_CREATE)

bool

CHART_EVENT_OBJECT_DELETE

Отправка всем mql5-программам на графике сообщений о событии уничтожения графического объекта (CHARTEVENT_OBJECT_DELETE)

bool

CHART_KEYBOARD_CONTROL

Разрешение на управление графиком с помощью клавиатуры ("Home", "End", "PageUp", "+", "-", "Стрелка вверх" и т.д.). Установка CHART_KEYBOARD_CONTROL=false позволяет отключить скроллинг и масштабирование графика, но при этом сохраняется возможность получать события нажатия данных клавиш в OnChartEvent().

bool

CHART_SHOW_OBJECT_DESCR

Отображение текстовых описаний объектов (не для всех объектов описания показываются)

bool

CHART_SHOW_ONE_CLICK

Отображение на графике панели быстрой торговли (опция "Торговля одним кликом")

bool

CHART_IS_MAXIMIZED

Окно графика развернуто

bool

CHART_IS_MINIMIZED

Окно графика свернуто

bool

CHART_IS_DOCKED

Окно графика закреплено. Если установить значение false, то график можно перетащить за пределы терминала

bool

CHART_FLOAT_LEFT

Левая координата открепленного графика относительно виртуального экрана

int

CHART_FLOAT_TOP

Верхняя координата открепленного графика относительно виртуального экрана

int

CHART_FLOAT_RIGHT

Правая координата открепленного графика относительно виртуального экрана

int

CHART_FLOAT_BOTTOM

Нижняя координата открепленного графика относительно виртуального экрана

int


Типы событий графика

Справочник MQL4 / Константы, перечисления и структуры / Константы графиков / Типы событий графика

Типы событий графика

Существуют 9 видов событий, которые можно обрабатывать с помощью функции предопределенной функции OnChartEvent(). Для пользовательских событий предусмотрено 65535 идентификаторов в диапазоне от CHARTEVENT_CUSTOM до CHARTEVENT_CUSTOM_LAST включительно. Для генерации пользовательского события необходимо использовать функцию EventChartCustom().

ENUM_CHART_EVENT

Идентификатор | Описание
CHARTEVENT_KEYDOWN | Нажатие клавиатуры
CHARTEVENT_MOUSE_MOVE | Перемещение мыши и нажатие кнопок мыши (если для графика установлено свойство CHART_EVENT_MOUSE_MOVE=true)
CHARTEVENT_OBJECT_CREATE | Создание графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_CREATE=true)
CHARTEVENT_OBJECT_CHANGE | Изменение свойств графического объекта через диалог свойств
CHARTEVENT_OBJECT_DELETE | Удаление графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_DELETE=true)
CHARTEVENT_CLICK | Нажатие мышки на графике
CHARTEVENT_OBJECT_CLICK | Нажатие мышки на графическом объекте
CHARTEVENT_OBJECT_DRAG | Перетаскивание графического объекта
CHARTEVENT_OBJECT_ENDEDIT | Окончание редактирования текста в графическом объекте Edit
CHARTEVENT_CHART_CHANGE | Изменение размеров графика или изменение свойств графика через диалог свойств
CHARTEVENT_CUSTOM | Начальный номер события из диапазона пользовательских событий
CHARTEVENT_CUSTOM_LAST | Конечный номер события из диапазона пользовательских событий

Для каждого типа события входные параметры функции OnChartEvent() имеют определенные значения, которые необходимы для обработки этого события. В таблице перечислены события и значения, которые передаются через параметры.

Событие | Значение параметра id | Значение параметра lparam | Значение параметра dparam | Значение параметра sparam
Событие нажатия клавиатуры | CHARTEVENT_KEYDOWN | код нажатой клавиши | Количество нажатий клавиши,сгенерированных за время её удержания в нажатом состоянии | Строковое значение битовой маски, описывающее статус кнопок клавиатуры
События мыши (если для графика установлено свойство CHART_EVENT_MOUSE_MOVE=true) | CHARTEVENT_MOUSE_MOVE | X координата | Y координата | Строковое значение битовой маски, описывающее статус кнопок мыши
Событие создания графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_CREATE=true) | CHARTEVENT_OBJECT_CREATE | — | — | Имя созданного графического объекта
Событие изменения свойств объекта через диалог свойств | CHARTEVENT_OBJECT_CHANGE | — | — | Имя измененного графического объекта
Событие удаления графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_DELETE=true) | CHARTEVENT_OBJECT_DELETE | — | — | Имя удаленного графического объекта
Событие щелчка мыши на графике | CHARTEVENT_CLICK | X координата | Y координата | —
Событие щелчка мыши на графическом объекте | CHARTEVENT_OBJECT_CLICK | X координата | Y координата | Имя графического объекта, на котором произошло событие
Событие перемещения графического объекта при помощи мыши | CHARTEVENT_OBJECT_DRAG | — | — | Имя перемещенного графического объекта
Событие окончания редактирования текста в поле ввода графического объекта "Поле ввода" | CHARTEVENT_OBJECT_ENDEDIT | — | — | Имя графического объекта "Поле ввода", в котором завершилось редактирование текста
Событие изменения размеров графика или изменения свойств графика через диалог свойств | CHARTEVENT_CHART_CHANGE | — | — | —
Пользовательское событие с номером N | CHARTEVENT_CUSTOM+N | Значение, заданное функцией EventChartCustom() | Значение, заданное функцией EventChartCustom() | Значение, заданное функцией EventChartCustom()

Пример:

#define KEY_NUMPAD_5 12
#define KEY_LEFT 37
#define KEY_UP 38
#define KEY_RIGHT 39
#define KEY_DOWN 40
#define KEY_NUMLOCK_DOWN 98
#define KEY_NUMLOCK_LEFT 100
#define KEY_NUMLOCK_5 101
#define KEY_NUMLOCK_RIGHT 102
#define KEY_NUMLOCK_UP 104
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Print("Запущен эксперт с именем ",MQLInfoString(MQL_PROGRAM_NAME));
//--- установка флага получения событий создания объектов графика
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- установка флага получения событий удаления объектов графика
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // идентификатор события
const long& lparam, // параметр события типа long
const double& dparam, // параметр события типа double
const string& sparam) // параметр события типа string
{
//--- нажатие левой кнопкой мышки на графике
if(id==CHARTEVENT_CLICK)
{
Print("Координаты щелчка мышки на графике: x = ",lparam," y = ",dparam);
}
//--- нажатие мышкой на графическом объекте
if(id==CHARTEVENT_OBJECT_CLICK)
{
Print("Нажатие кнопки мышки на объекте с именем '"+sparam+"'");
}
//--- нажатие кнопки на клавиатуре
if(id==CHARTEVENT_KEYDOWN)
{
switch(int(lparam))
{
case KEY_NUMLOCK_LEFT: Print("Нажата KEY_NUMLOCK_LEFT"); break;
case KEY_LEFT: Print("Нажата KEY_LEFT"); break;
case KEY_NUMLOCK_UP: Print("Нажата KEY_NUMLOCK_UP"); break;
case KEY_UP: Print("Нажата KEY_UP"); break;
case KEY_NUMLOCK_RIGHT: Print("Нажата KEY_NUMLOCK_RIGHT"); break;
case KEY_RIGHT: Print("Нажата KEY_RIGHT"); break;
case KEY_NUMLOCK_DOWN: Print("Нажата KEY_NUMLOCK_DOWN"); break;
case KEY_DOWN: Print("Нажата KEY_DOWN"); break;
case KEY_NUMPAD_5: Print("Нажата KEY_NUMPAD_5"); break;
case KEY_NUMLOCK_5: Print("Нажата KEY_NUMLOCK_5"); break;
default: Print("Нажата какая-то неперечисленная клавиша");
}
ChartRedraw();
}
//--- удален объект
if(id==CHARTEVENT_OBJECT_DELETE)
{
Print("Удален объект с именем ",sparam);
}
//--- создан объект
if(id==CHARTEVENT_OBJECT_CREATE)
{
Print("Создан объект с именем ",sparam);
}
//--- перемещен объект или изменены координаты точек привязки
if(id==CHARTEVENT_OBJECT_DRAG)
{
Print("Изменение точек привязки объекта с именем ",sparam);
}
//--- изменен текст в поле ввода графического объекта Edit
if(id==CHARTEVENT_OBJECT_ENDEDIT)
{
Print("Изменен текст в объекте Edit ",sparam);
}
}

Для события CHARTEVENT_MOUSE_MOVE строковой параметр sparam содержит число, представляющее информацию о состоянии клавиш:

Бит | Описание
1 | Состояние левой клавиши мыши
2 | Состояние правой клавиши мыши
3 | Состояние клавиши SHIFT
4 | Состояние клавиши CTRL
5 | Состояние средней клавиши мыши
6 | Состояние первой дополнительной клавиши мыши
7 | Состояние второй дополнительной клавиши мыши

Пример:

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- включение сообщений о перемещении мыши по окну чарта
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
}
//+------------------------------------------------------------------+
//| MouseState |
//+------------------------------------------------------------------+
string MouseState(uint state)
{
string res;
res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // mouse left
res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // mouse right
res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // mouse middle
res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // mouse first X key
res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // mouse second X key
res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // shift key
res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // control key
return(res);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_MOUSE_MOVE)
Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
}

Смотри также

Функции обработки событий, Работа с событиями


Периоды графиков

Справочник MQL4 / Константы, перечисления и структуры / Константы графиков / Периоды графиков

Периоды графиков

Все предопределенные периоды графиков имеют уникальные идентификаторы. Идентификатор PERIOD_CURRENT означает текущий период графика, на котором запущена mql4-программа.

ENUM_TIMEFRAMES

Идентификатор | Значение | Описание
PERIOD_CURRENT | 0 | Текущий период
PERIOD_M1 | 1 | 1 минута
PERIOD_M5 | 5 | 5 минут
PERIOD_M15 | 15 | 15 минут
PERIOD_M30 | 30 | 30 минут
PERIOD_H1 | 60 | 1 час
PERIOD_H4 | 240 | 4 часа
PERIOD_D1 | 1440 | 1 день
PERIOD_W1 | 10080 | 1 неделя
PERIOD_MN1 | 43200 | 1 месяц

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

Ниже перечислены нестандартные таймфреймы, которые в языке MQL4 являются просто константами.

Константа | Значение | Описание
PERIOD_M2 | 2 | 2 минуты
PERIOD_M3 | 3 | 3 минуты
PERIOD_M4 | 4 | 4 минуты
PERIOD_M6 | 6 | 6 минут
PERIOD_M10 | 10 | 10 минут
PERIOD_M12 | 12 | 12 минут
PERIOD_M20 | 20 | 20 минут
PERIOD_H2 | 120 | 2 часа
PERIOD_H3 | 180 | 3 часа
PERIOD_H6 | 360 | 6 часа
PERIOD_H8 | 480 | 8 часа
PERIOD_H12 | 720 | 12 часов

Эти периоды могут быть использованы при работе с автономными графиками.

Примечание

Константы нестандартных таймфреймов введены в язык MQL4 для возможности переноса и компиляции программ MQL5, где они являются стандартными и входят в состав перечисления ENUM_TIMEFRAMES.

Смотри также

PeriodSeconds(), Period(), Дата и время, Видимость объектов


Свойства графиков

Справочник MQL4 / Константы, перечисления и структуры / Константы графиков / Свойства графиков

Свойства графиков

Идентификаторы семейства перечислений ENUM_CHART_PROPERTY используются в качестве параметров функций для работы с графиками. Аббревиатура r/o в столбце "Тип свойства" означает, что данное свойство предназначено только для чтения и не может быть изменено. Аббревиатура w/o в столбце "Тип свойства" означает, что данное свойство предназначено только для записи и не может быть получено. При обращении к некоторым свойствам необходимо указывать дополнительный параметр-модификатор (modifier), который служит для указания номера подокна графика. 0 означает главное окно.

Для функций ChartSetInteger() и ChartGetInteger()

ENUM_CHART_PROPERTY_INTEGER

Идентификатор

Описание

Тип свойства

CHART_BRING_TO_TOP

Показ графика поверх всех других

bool w/o

CHART_MOUSE_SCROLL

Прокрутка графика левой кнопкой мышки по горизонтали. Прокрутка по вертикали также будет доступна, если установлено в true значение любого из трех свойств: CHART_SCALEFIX, CHART_SCALEFIX_11 или CHART_SCALE_PT_PER_BAR

bool

CHART_EVENT_MOUSE_MOVE

Отправка всем mql4-программам на графике сообщений о событиях перемещения и нажатия кнопок мыши (CHARTEVENT_MOUSE_MOVE)

bool

CHART_EVENT_OBJECT_CREATE

Отправка всем mql4-программам на графике сообщений о событии создания графического объекта (CHARTEVENT_OBJECT_CREATE)

bool

CHART_EVENT_OBJECT_DELETE

Отправка всем mql4-программам на графике сообщений о событии уничтожения графического объекта (CHARTEVENT_OBJECT_DELETE)

bool

CHART_MODE

Тип графика (свечи, бары или линия)

enum ENUM_CHART_MODE

CHART_FOREGROUND

Ценовой график на переднем плане

bool

CHART_SHIFT

Режим отступа ценового графика от правого края

bool

CHART_AUTOSCROLL

Режим автоматического перехода к правому краю графика

bool

CHART_QUICK_NAVIGATION

Разрешение на перехват графиком нажатий клавиш Space и Enter для активации строки быстрой навигации. Строка быстрой навигации автоматически появляется внизу графика при двойном клике мышки или нажатии клавиш Space/Enter. Таким образом можно быстро сменить символ, таймфрейм и дату первого видимого бара.

bool

CHART_SCALE

Масштаб

int от 0 до 5

CHART_SCALEFIX

Режим фиксированного масштаба

bool

CHART_SCALEFIX_11

Режим масштаба 1:1

bool

CHART_SCALE_PT_PER_BAR

Режим указания масштаба в пунктах на бар

bool

CHART_SHOW_OHLC

Отображение в левом верхнем углу значений OHLC

bool

CHART_SHOW_BID_LINE

Отображение значения Bid горизонтальной линией на графике

bool

CHART_SHOW_ASK_LINE

Отображение значения Ask горизонтальной линией на графике

bool

CHART_SHOW_LAST_LINE

Отображение значения Last горизонтальной линией на графике

bool

CHART_SHOW_PERIOD_SEP

Отображение вертикальных разделителей между соседними периодами

bool

CHART_SHOW_GRID

Отображение сетки на графике

bool

CHART_SHOW_VOLUMES

Отображение объемов на графике

enum ENUM_CHART_VOLUME_MODE

CHART_SHOW_OBJECT_DESCR

Отображение текстовых описаний объектов (не для всех объектов описания показываются)

bool

CHART_VISIBLE_BARS

Количество баров на графике, доступных для отображения

int r/o

CHART_WINDOWS_TOTAL

Общее количество окон графика, включая подокна индикаторов

int r/o

CHART_WINDOW_IS_VISIBLE

Видимость подокон

bool r/o модификатор - номер подокна

CHART_WINDOW_HANDLE

Хэндл графика (HWND)

int r/o

CHART_WINDOW_YDISTANCE

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

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

int r/o модификатор - номер подокна

CHART_FIRST_VISIBLE_BAR

Номер первого видимого бара на графике. Индексация баров соответствует таймсерии.

int r/o

CHART_WIDTH_IN_BARS

Ширина графика в барах

int r/o

CHART_WIDTH_IN_PIXELS

Ширина графика в пикселях

int r/o

CHART_HEIGHT_IN_PIXELS

Высота графика в пикселях

int модификатор - номер подокна

CHART_COLOR_BACKGROUND

Цвет фона графика

color

CHART_COLOR_FOREGROUND

Цвет осей, шкалы и строки OHLC

color

CHART_COLOR_GRID

Цвет сетки

color

CHART_COLOR_VOLUME

Цвет объемов и уровней открытия ордеров

color

CHART_COLOR_CHART_UP

Цвет бара вверх, тени и окантовки тела бычьей свечи

color

CHART_COLOR_CHART_DOWN

Цвет бара вниз, тени и окантовки тела медвежьей свечи

color

CHART_COLOR_CHART_LINE

Цвет линии графика и японских свечей "Доджи"

color

CHART_COLOR_CANDLE_BULL

Цвет тела бычьей свечи

color

CHART_COLOR_CANDLE_BEAR

Цвет тела медвежьей свечи

color

CHART_COLOR_BID

Цвет линии Bid-цены

color

CHART_COLOR_ASK

Цвет линии Ask-цены

color

CHART_COLOR_LAST

Цвет линии цены последней совершенной сделки (Last)

color

CHART_COLOR_STOP_LEVEL

Цвет уровней стоп-ордеров (Stop Loss и Take Profit)

color

CHART_SHOW_TRADE_LEVELS

Отображение на графике торговых уровней (уровни открытых ордеров, Stop Loss, Take Profit и отложенных ордеров)

bool

CHART_DRAG_TRADE_LEVELS

Разрешение на перетаскивание торговых уровней на графике с помощью мышки. По умолчанию режим перетаскивания включен (значение true)

bool

CHART_SHOW_DATE_SCALE

Отображение на графике шкалы времени

bool

CHART_SHOW_PRICE_SCALE

Отображение на графике ценовой шкалы

bool

CHART_IS_OFFLINE

Признак, определяющий, является ли график автономным

bool r/o

Для функций ChartSetDouble() и ChartGetDouble()

ENUM_CHART_PROPERTY_DOUBLE

Идентификатор | Описание | Тип свойства
CHART_SHIFT_SIZE | Размер отступа нулевого бара от правого края в процентах | double (от 10 до 50 процентов)
CHART_FIXED_POSITION | Положение фиксированной позиции графика от левого края в процентах. Фиксированная позиция графика обозначена маленьким серым треугольником на горизонтальной оси времени и показывается только в том случае, если отключена автоматическая прокрутка к правому краю при поступлении нового тика (смотри свойство CHART_AUTOSCROLL). Бар, который находится на фиксированной позиции, остаётся на том же месте при увеличении и уменьшении масштаба. | double
CHART_FIXED_MAX | Фиксированный максимум графика | double
CHART_FIXED_MIN | Фиксированный минимум графика | double
CHART_POINTS_PER_BAR | Значение масштаба в пунктах на бар | double
CHART_PRICE_MIN | Минимум графика | double r/o модификатор - номер подокна
CHART_PRICE_MAX | Максимум графика | double r/o модификатор - номер подокна

Для функций ChartSetString() и ChartGetString()

ENUM_CHART_PROPERTY_STRING

Идентификатор | Описание | Тип свойства
CHART_COMMENT | Текст комментария на графике | string

Пример:

int chartMode=ChartGetInteger(0,CHART_MODE);
switch(chartMode)
{
case(CHART_BARS): Print("CHART_BARS"); break;
case(CHART_CANDLES): Print("CHART_CANDLES");break;
default:Print("CHART_LINE");
}
bool shifted=ChartGetInteger(0,CHART_SHIFT);
if(shifted) Print("CHART_SHIFT = true");
else Print("CHART_SHIFT = false");
bool autoscroll=ChartGetInteger(0,CHART_AUTOSCROLL);
if(autoscroll) Print("CHART_AUTOSCROLL = true");
else Print("CHART_AUTOSCROLL = false");
int chartHandle=ChartGetInteger(0,CHART_WINDOW_HANDLE);
Print("CHART_WINDOW_HANDLE = ",chartHandle);
int windows=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
Print("CHART_WINDOWS_TOTAL = ",windows);
if(windows>1)
{
for(int i=0;i<windows;i++)
{
int height=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,i);
double priceMin=ChartGetDouble(0,CHART_PRICE_MIN,i);
double priceMax=ChartGetDouble(0,CHART_PRICE_MAX,i);
Print(i+": CHART_HEIGHT_IN_PIXELS = ",height,"pixels");
Print(i+": CHART_PRICE_MIN = ",priceMin);
Print(i+": CHART_PRICE_MAX = ",priceMax);
}
}

Смотри также

Примеры работы с графиком


Позиционирование графика

Справочник MQL4 / Константы, перечисления и структуры / Константы графиков / Позиционирование графика

Позиционирование графика

Три идентификатора из списка ENUM_CHART_POSITION являются возможными значениями параметра position для функции ChartNavigate().

ENUM_CHART_POSITION

Идентификатор | Описание
CHART_BEGIN | Начало графика (самые старые цены)
CHART_CURRENT_POS | Текущая позиция
CHART_END | Конец графика (самые свежие цены)

Пример:

long handle=ChartOpen("EURUSD",PERIOD_H12);
if(handle!=0)
{
ChartSetInteger(handle,CHART_AUTOSCROLL,false);
ChartSetInteger(handle,CHART_SHIFT,true);
ChartSetInteger(handle,CHART_MODE,CHART_LINE);
ResetLastError();
bool res=ChartNavigate(handle,CHART_END,150);
if(!res) Print("Navigate failed. Error = ",GetLastError());
ChartRedraw();
}


Отображение графиков

Справочник MQL4 / Константы, перечисления и структуры / Константы графиков / Отображение графиков

Отображение графиков

Ценовые графики можно отображать тремя способами:

  • в виде баров;
  • в виде свечей;
  • в виде ломаной линии.

Конкретный способ отображения ценового графика задается функцией ChartSetInteger(handle_графика,CHART_MODE, тип_графика), где тип_графика – одно из значений перечисления ENUM_CHART_MODE.

ENUM_CHART_MODE

Идентификатор | Описание
CHART_BARS | Отображение в виде баров
CHART_CANDLES | Отображение в виде японских свечей
CHART_LINE | Отображение в виде линии, проведенной по ценам Close

Для указания режима отображения объемов на ценовом графике используется функция ChartSetInteger(handle_графика, CHART_SHOW_VOLUMES, тип_отображения), где тип_отображения – одно из значений перечисления ENUM_CHART_VOLUME_MODE.

ENUM_CHART_VOLUME_MODE

Идентификатор | Описание
CHART_VOLUME_HIDE | Объемы не показаны
CHART_VOLUME_TICK | Тиковые объемы

Пример:

//--- получим handle текущего графика
long handle=ChartID();
if(handle>0) // если получилось, дополнительно настроим
{
//--- отключим автопрокрутку
ChartSetInteger(handle,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
ChartSetInteger(handle,CHART_SHIFT,true);
//--- отобразим в виде свечей
ChartSetInteger(handle,CHART_MODE,CHART_CANDLES);
//--- прокрутим на 100 баров от начала истории
ChartNavigate(handle,CHART_CURRENT_POS,100);
//--- установить режим отображения тиковых объемов
ChartSetInteger(handle,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK);
}

Смотри также

ChartOpen(), ChartID()


Примеры работы с графиком

Справочник MQL4 / Константы, перечисления и структуры / Константы графиков / Примеры работы с графиком

Примеры работы с графиком

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

На рисунке показана графическая панель для наглядной демонстрации того, как изменение свойства графика меняет его внешний вид. Нажатие кнопки "Next" позволяет установить новое значение соответствующего свойства и увидеть изменения в окне графика.

Исходный код панели находится ниже.

Свойства графика и примеры функций для работы с ними

  • CHART_BRING_TO_TOP – показывает график поверх всех других.

//+------------------------------------------------------------------+
//| Отправка терминалу команды на показ графика поверх всех других. |
//+------------------------------------------------------------------+
bool ChartBringToTop(const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- покажем график поверх всех других
if(!ChartSetInteger(chart_ID,CHART_BRING_TO_TOP,0,true))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_MOUSE_SCROLL – свойство прокрутки графика левой кнопкой мыши.

//+------------------------------------------------------------------+
//| Функция определяет, можно ли прокручивать график левой кнопкой |
//| мыши. |
//+------------------------------------------------------------------+
bool ChartMouseScrollGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_MOUSE_SCROLL,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим прокрутки графика левой кнопкой |
//| мыши. |
//+------------------------------------------------------------------+
bool ChartMouseScrollSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_MOUSE_SCROLL,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_EVENT_MOUSE_MOVE – свойство отправки mql4-программам сообщений о событиях перемещения и нажатия кнопок мыши (CHARTEVENT_MOUSE_MOVE).

//+------------------------------------------------------------------+
//| Отправляются ли сообщения о событиях перемещения и нажатия кнопок|
//| мыши всем mql4-программам на данном графике? |
//+------------------------------------------------------------------+
bool ChartEventMouseMoveGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_EVENT_MOUSE_MOVE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отправки сообщений о событиях |
//| перемещения и нажатия кнопок мыши всем mql4-программам на данном |
//| графике. |
//+------------------------------------------------------------------+
bool ChartEventMouseMoveSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_EVENT_MOUSE_MOVE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_EVENT_OBJECT_CREATE – свойство отправки mql4-программам сообщений о событии создания графического объекта (CHARTEVENT_OBJECT_CREATE).

//+------------------------------------------------------------------+
//| Отправляются ли сообщения о событии создания графического объекта|
//| всем mql4-программам на данном графике? |
//+------------------------------------------------------------------+
bool ChartEventObjectCreateGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_EVENT_OBJECT_CREATE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отправки сообщений о событии |
//| создания графического объекта всем mql4-программам на данном |
//| графике. |
//+------------------------------------------------------------------+
bool ChartEventObjectCreateSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_EVENT_OBJECT_CREATE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_EVENT_OBJECT_DELETE – свойство отправки mql4-программам сообщений о событии удаления графического объекта (CHARTEVENT_OBJECT_DELETE).

//+------------------------------------------------------------------+
//| Отправляются ли сообщения о событии удаления графического объекта|
//| всем mql4-программам на данном графике? |
//+------------------------------------------------------------------+
bool ChartEventObjectDeleteGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_EVENT_OBJECT_DELETE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отправки сообщений о событии |
//| удаления графического объекта всем mql4-программам на данном |
//| графике. |
//+------------------------------------------------------------------+
bool ChartEventObjectDeleteSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_EVENT_OBJECT_DELETE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_MODE – тип графика (свечи, бары или линия).

//+------------------------------------------------------------------+
//| Получение типа отображения графика (в виде свечей, баров или |
//| линии). |
//+------------------------------------------------------------------+
ENUM_CHART_MODE ChartModeGet(const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long result=WRONG_VALUE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_MODE,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((ENUM_CHART_MODE)result);
}
//+------------------------------------------------------------------+
//| Установка типа отображения графика (в виде свечей, баров или |
//| линии). |
//+------------------------------------------------------------------+
bool ChartModeSet(const long value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_MODE,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_FOREGROUND – свойство отображения ценового графика на переднем плане.

//+------------------------------------------------------------------+
//| Функция определяет, отображается ли ценовой график на переднем |
//| плане. |
//+------------------------------------------------------------------+
bool ChartForegroundGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_FOREGROUND,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения ценового графика на |
//| переднем плане. |
//+------------------------------------------------------------------+
bool ChartForegroundSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_FOREGROUND,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHIFT – режим отступа ценового графика от правого края.

//+------------------------------------------------------------------+
//| Функция определяет, включен ли режим отображения ценового графика|
//| с отступом от правого края. |
//+------------------------------------------------------------------+
bool ChartShiftGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SHIFT,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения ценового графика с |
//| отступом от правого края. |
//+------------------------------------------------------------------+
bool ChartShiftSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SHIFT,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_AUTOSCROLL – режим автоматического перехода к правому краю графика.

//+------------------------------------------------------------------+
//| Функция определяет, включен ли режим автоматической прокрутки |
//| графика вправо при поступлении новых тиков. |
//+------------------------------------------------------------------+
bool ChartAutoscrollGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_AUTOSCROLL,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим автоматической прокрутки графика|
//| вправо при поступлении новых тиков. |
//+------------------------------------------------------------------+
bool ChartAutoscrollSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_AUTOSCROLL,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SCALE – свойство масштаба графика.

//+------------------------------------------------------------------+
//| Получение масштаба графика (от 0 до 5). |
//+------------------------------------------------------------------+
int ChartScaleGet(const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long result=-1;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SCALE,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((int)result);
}
//+------------------------------------------------------------------+
//| Установка масштаба графика (от 0 до 5). |
//+------------------------------------------------------------------+
bool ChartScaleSet(const long value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SCALE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SCALEFIX – режим фиксированного масштаба графика.

//+------------------------------------------------------------------+
//| Функция определяет, включен ли режим фиксированного масштаба. |
//+------------------------------------------------------------------+
bool ChartScaleFixGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SCALEFIX,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим фиксированного масштаба. |
//+------------------------------------------------------------------+
bool ChartScaleFixSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SCALEFIX,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SCALEFIX_11 – режим масштаба графика 1:1.

//+------------------------------------------------------------------+
//| Функция определяет, включен ли режим масштаба "1:1". |
//+------------------------------------------------------------------+
bool ChartScaleFix11Get(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SCALEFIX_11,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим масштаба "1:1" |
//+------------------------------------------------------------------+
bool ChartScaleFix11Set(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SCALEFIX_11,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SCALE_PT_PER_BAR – режим указания масштаба графика в пунктах на бар.

//+------------------------------------------------------------------+
//| Функция определяет, включен ли режим указания масштаба в пунктах |
//| на бар. |
//+------------------------------------------------------------------+
bool ChartScalePerBarGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SCALE_PT_PER_BAR,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим указания масштаба в пунктах на |
//| бар. |
//+------------------------------------------------------------------+
bool ChartScalePerBarSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SCALE_PT_PER_BAR,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHOW_OHLC – свойство отображения в левом верхнем углу значений OHLC.

//+------------------------------------------------------------------+
//| Функция определяет, включен ли режим отображения значений OHLC |
//| в левом верхнем углу. |
//+------------------------------------------------------------------+
bool ChartShowOHLCGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SHOW_OHLC,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения значений OHLC в |
//| левом верхнем углу графика. |
//+------------------------------------------------------------------+
bool ChartShowOHLCSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SHOW_OHLC,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHOW_BID_LINE – свойство отображения значения Bid горизонтальной линией на графике.

//+------------------------------------------------------------------+
//| Функция определяет, включен ли режим отображения линии Bid на |
//| графике. |
//+------------------------------------------------------------------+
bool ChartShowBidLineGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SHOW_BID_LINE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения линии Bid на |
//| графике. |
//+------------------------------------------------------------------+
bool ChartShowBidLineSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SHOW_BID_LINE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHOW_ASK_LINE – свойство отображения значения Ask горизонтальной линией на графике.

//+------------------------------------------------------------------+
//| Функция определяет, включен ли режим отображения линии Ask на |
//| графике. |
//+------------------------------------------------------------------+
bool ChartShowAskLineGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SHOW_ASK_LINE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения линии Ask на |
//| графике. |
//+------------------------------------------------------------------+
bool ChartShowAskLineSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SHOW_ASK_LINE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHOW_LAST_LINE – свойство отображения значения Last горизонтальной линией на графике.

//+------------------------------------------------------------------+
//| Функция определяет, включен ли режим отображения линии для цены |
//| последней совершенной сделки. |
//+------------------------------------------------------------------+
bool ChartShowLastLineGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SHOW_LAST_LINE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения линии цены последней|
//| совершенной сделки. |
//+------------------------------------------------------------------+
bool ChartShowLastLineSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SHOW_LAST_LINE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHOW_PERIOD_SEP – свойство отображения вертикальных разделителей между соседними периодами.

//+------------------------------------------------------------------+
//| Функция определяет, включен ли режим отображения вертикальных |
//| разделителей между соседними периодами. |
//+------------------------------------------------------------------+
bool ChartShowPeriodSeparatorGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SHOW_PERIOD_SEP,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения вертикальных |
//| разделителей между соседними периодами. |
//+------------------------------------------------------------------+
bool ChartShowPeriodSepapatorSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SHOW_PERIOD_SEP,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHOW_GRID – свойство отображения сетки на графике.

//+------------------------------------------------------------------+
//| Функция определяет, отображается ли сетка на графике. |
//+------------------------------------------------------------------+
bool ChartShowGridGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SHOW_GRID,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает отображение сетки на графике. |
//+------------------------------------------------------------------+
bool ChartShowGridSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SHOW_GRID,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHOW_VOLUMES – свойство отображения объемов на графике.

//+------------------------------------------------------------------+
//| Функция определяет, отображаются ли объемы на графике (не |
//| отображаются, отображаются тиковые, отображаются реальные). |
//+------------------------------------------------------------------+
ENUM_CHART_VOLUME_MODE ChartShowVolumesGet(const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long result=WRONG_VALUE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SHOW_VOLUMES,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((ENUM_CHART_VOLUME_MODE)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает режим отображения объемов на графике. |
//+------------------------------------------------------------------+
bool ChartShowVolumesSet(const long value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SHOW_VOLUMES,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHOW_OBJECT_DESCR – свойство всплывающих описаний графических объектов.

//+------------------------------------------------------------------+
//| Функция определяет, отображаются ли всплывающие описания |
//| графических объектов при наведение на них мышью. |
//+------------------------------------------------------------------+
bool ChartShowObjectDescriptionGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SHOW_OBJECT_DESCR,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения всплывающих описаний|
//| графических объектов при наведение на них мышью. |
//+------------------------------------------------------------------+
bool ChartShowObjectDescriptionSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SHOW_OBJECT_DESCR,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_VISIBLE_BARS – определяет количество баров на графике, доступных для отображения.

//+------------------------------------------------------------------+
//| Функция получает количество баров, которые отображаются (видимы )|
//| в окне графика. |
//+------------------------------------------------------------------+
int ChartVisibleBars(const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long result=-1;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_VISIBLE_BARS,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((int)result);
}

  • CHART_WINDOWS_TOTAL – определяет общее количество окон графика, включая подокна индикаторов.

//+------------------------------------------------------------------+
//| Функция получает общее количество окон графика, включая подокна |
//| индикаторов. |
//+------------------------------------------------------------------+
int ChartWindowsTotal(const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long result=-1;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_WINDOWS_TOTAL,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((int)result);
}

  • CHART_WINDOW_IS_VISIBLE – определяет видимость подокна.

//+------------------------------------------------------------------+
//| Функция определяет, является ли данное окно или подокно графика |
//| видимым. |
//+------------------------------------------------------------------+
bool ChartWindowsIsVisible(bool &result,const long chart_ID=0,const int sub_window=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_WINDOW_IS_VISIBLE,sub_window,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}

  • CHART_WINDOW_HANDLE – возвращает хэндл графика.

//+------------------------------------------------------------------+
//| Функция получает хэндл графика |
//+------------------------------------------------------------------+
int ChartWindowsHandle(const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long result=-1;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_WINDOW_HANDLE,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((int)result);
}

  • CHART_WINDOW_YDISTANCE – определяет дистанцию в пикселях между верхней рамкой подокна индикатора и верхней рамкой главного окна графика.

//+------------------------------------------------------------------+
//| Функция получает расстояние в пикселях между верхней рамкой |
//| подокна и верхней рамкой главного окна графика. |
//+------------------------------------------------------------------+
int ChartWindowsYDistance(const long chart_ID=0,const int sub_window=0)
{
//--- подготовим переменную для получения значения свойства
long result=-1;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_WINDOW_YDISTANCE,sub_window,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((int)result);
}

  • CHART_FIRST_VISIBLE_BAR – возвращает номер первого видимого бара на графике (индексация баров соответствует таймсерии).

//+------------------------------------------------------------------+
//| Функция получает номер первого видимого бара на графике. |
//| Индексация как в таймсерии, последние бары имеют меньшие индексы.|
//+------------------------------------------------------------------+
int ChartFirstVisibleBar(const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long result=-1;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_WINDOW_YDISTANCE,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((int)result);
}

  • CHART_WIDTH_IN_BARS – возвращает ширину графика в барах.

//+------------------------------------------------------------------+
//| Функция получает значение ширины графика в барах. |
//+------------------------------------------------------------------+
int ChartWidthInBars(const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long result=-1;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_BARS,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((int)result);
}

  • CHART_WIDTH_IN_PIXELS – возвращает ширину графика в пикселях.

//+------------------------------------------------------------------+
//| Функция получает значение ширины графика в пикселях. |
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long result=-1;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((int)result);
}

  • CHART_HEIGHT_IN_PIXELS – свойство высоты графика в пикселях.

//+------------------------------------------------------------------+
//| Функция получает значение высоты графика в пикселях. |
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
{
//--- подготовим переменную для получения значения свойства
long result=-1;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((int)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает значение высоты графика в пикселях. |
//+------------------------------------------------------------------+
bool ChartHeightInPixelsSet(const int value,const long chart_ID=0,const int sub_window=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_BACKGROUND – цвет фона графика.

//+------------------------------------------------------------------+
//| Функция получает цвет фона графика. |
//+------------------------------------------------------------------+
color ChartBackColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет фона графика
if(!ChartGetInteger(chart_ID,CHART_COLOR_BACKGROUND,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвет фона графика. |
//+------------------------------------------------------------------+
bool ChartBackColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет фона графика
if(!ChartSetInteger(chart_ID,CHART_COLOR_BACKGROUND,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_FOREGROUND – цвет осей, шкалы и строки OHLC.

//+------------------------------------------------------------------+
//| Функция получает цвет осей, шкалы и строки OHLC графика. |
//+------------------------------------------------------------------+
color ChartForeColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет осей, шкалы и строки OHLC графика
if(!ChartGetInteger(chart_ID,CHART_COLOR_FOREGROUND,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвет осей, шкалы и строки OHLC графика. |
//+------------------------------------------------------------------+
bool ChartForeColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет осей, шкалы и строки OHLC графика
if(!ChartSetInteger(chart_ID,CHART_COLOR_FOREGROUND,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_GRID – цвет сетки графика.

//+------------------------------------------------------------------+
//| Функция получает цвет сетки графика. |
//+------------------------------------------------------------------+
color ChartGridColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет сетки графика
if(!ChartGetInteger(chart_ID,CHART_COLOR_GRID,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвет сетки графика. |
//+------------------------------------------------------------------+
bool ChartGridColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет сетки графика
if(!ChartSetInteger(chart_ID,CHART_COLOR_GRID,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_VOLUME – цвет объемов и уровней открытия ордеров.

//+------------------------------------------------------------------+
//| Функция получает цвет отображения объемов и уровней открытия |
//| ордеров. |
//+------------------------------------------------------------------+
color ChartVolumeColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет объемов и уровней открытия ордеров
if(!ChartGetInteger(chart_ID,CHART_COLOR_VOLUME,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвет отображения объемов и уровней открытия|
//| ордеров. |
//+------------------------------------------------------------------+
bool ChartVolumeColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет объемов и уровней открытия ордеров
if(!ChartSetInteger(chart_ID,CHART_COLOR_VOLUME,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_CHART_UP – цвет бара вверх, тени и окантовки тела бычьей свечи.

//+------------------------------------------------------------------+
//| Функция получает цвет бара направленного вверх, цвет тени и |
//| окантовки тела бычьей свечи. |
//+------------------------------------------------------------------+
color ChartUpColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет бара вверх, тени и окантовки тела бычьей свечи
if(!ChartGetInteger(chart_ID,CHART_COLOR_CHART_UP,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвет бара направленного вверх, цвет тени и |
//| окантовки тела бычьей свечи. |
//+------------------------------------------------------------------+
bool ChartUpColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет бара вверх, тени и окантовки тела бычьей свечи
if(!ChartSetInteger(chart_ID,CHART_COLOR_CHART_UP,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_CHART_DOWN – цвет бара вниз, тени и окантовки тела медвежьей свечи.

//+------------------------------------------------------------------+
//| Функция получает цвет бара направленного вниз, цвет тени и |
//| окантовки тела медвежьей свечи. |
//+------------------------------------------------------------------+
color ChartDownColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет бара вниз, тени и окантовки тела медвежьей свечи
if(!ChartGetInteger(chart_ID,CHART_COLOR_CHART_DOWN,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвет бара направленного вниз, цвет тени и |
//| окантовки тела медвежьей свечи. |
//+------------------------------------------------------------------+
bool ChartDownColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет бара вниз, тени и окантовки тела медвежьей свечи
if(!ChartSetInteger(chart_ID,CHART_COLOR_CHART_DOWN,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_CHART_LINE – цвет линии графика и японских свечей "Доджи".

//+------------------------------------------------------------------+
//| Функция получает цвет линии графика и японских свечей "Доджи". |
//+------------------------------------------------------------------+
color ChartLineColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет линии графика и японских свечей "Доджи"
if(!ChartGetInteger(chart_ID,CHART_COLOR_CHART_LINE,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвет линии графика и японских свечей |
//| "Доджи". |
//+------------------------------------------------------------------+
bool ChartLineColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет линии графика и японских свечей "Доджи"
if(!ChartSetInteger(chart_ID,CHART_COLOR_CHART_LINE,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_CANDLE_BULL – цвет тела бычьей свечи.

//+------------------------------------------------------------------+
//| Функция получает цвет тела бычьей свечи. |
//+------------------------------------------------------------------+
color ChartBullColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет тела бычьей свечи
if(!ChartGetInteger(chart_ID,CHART_COLOR_CANDLE_BULL,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвет тела бычьей свечи. |
//+------------------------------------------------------------------+
bool ChartBullColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет тела бычьей свечи
if(!ChartSetInteger(chart_ID,CHART_COLOR_CANDLE_BULL,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_CANDLE_BEAR – цвет тела медвежьей свечи.

//+------------------------------------------------------------------+
//| Функция получает цвет тела медвежьей свечи. |
//+------------------------------------------------------------------+
color ChartBearColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет тела медвежьей свечи
if(!ChartGetInteger(chart_ID,CHART_COLOR_CANDLE_BEAR,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвет тела медвежьей свечи. |
//+------------------------------------------------------------------+
bool ChartBearColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет тела медвежьей свечи
if(!ChartSetInteger(chart_ID,CHART_COLOR_CANDLE_BEAR,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_BID – цвет линии цены Bid.

//+------------------------------------------------------------------+
//| Функция получает цвет отображения линии Bid. |
//+------------------------------------------------------------------+
color ChartBidColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет линии цены Bid
if(!ChartGetInteger(chart_ID,CHART_COLOR_BID,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвет отображения линии Bid. |
//+------------------------------------------------------------------+
bool ChartBidColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет линии цены Bid
if(!ChartSetInteger(chart_ID,CHART_COLOR_BID,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_ASK – цвет линии цены Ask.

//+------------------------------------------------------------------+
//| Функция получает цвет отображения линии Ask. |
//+------------------------------------------------------------------+
color ChartAskColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет линии цены Ask
if(!ChartGetInteger(chart_ID,CHART_COLOR_ASK,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвет отображения линии Ask. |
//+------------------------------------------------------------------+
bool ChartAskColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет линии цены Ask
if(!ChartSetInteger(chart_ID,CHART_COLOR_ASK,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_LAST – цвет линии цены последней совершенной сделки (Last).

//+------------------------------------------------------------------+
//| Функция получает цвет линии цены последней совершенной сделки. |
//+------------------------------------------------------------------+
color ChartLastColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет линии цены последней совершенной сделки (Last)
if(!ChartGetInteger(chart_ID,CHART_COLOR_LAST,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвет линии цены последней совершенной |
//| сделки. |
//+------------------------------------------------------------------+
bool ChartLastColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет линии цены последней совершенной сделки (Last)
if(!ChartSetInteger(chart_ID,CHART_COLOR_LAST,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_COLOR_STOP_LEVEL – цвет уровней стоп-ордеров (Stop Loss и Take Profit).

//+------------------------------------------------------------------+
//| Функция получает цвета уровней Stop Loss и Take Profit. |
//+------------------------------------------------------------------+
color ChartStopLevelColorGet(const long chart_ID=0)
{
//--- подготовим переменную для получения цвета
long result=clrNONE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим цвет уровней стоп-ордеров (Stop Loss и Take Profit)
if(!ChartGetInteger(chart_ID,CHART_COLOR_STOP_LEVEL,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return((color)result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает цвета уровней Stop Loss и Take Profit. |
//+------------------------------------------------------------------+
bool ChartStopLevelColorSet(const color clr,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим цвет уровней стоп-ордеров (Stop Loss и Take Profit)
if(!ChartSetInteger(chart_ID,CHART_COLOR_STOP_LEVEL,clr))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHOW_TRADE_LEVELS – свойство отображения на графике торговых уровней (уровни открытых ордеров, Stop Loss, Take Profit и отложенных ордеров).

//+------------------------------------------------------------------+
//| Функция определяет, отображаются ли на графике торговые уровни. |
//+------------------------------------------------------------------+
bool ChartShowTradeLevelsGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SHOW_TRADE_LEVELS,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения торговых уровней. |
//+------------------------------------------------------------------+
bool ChartShowTradeLevelsSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SHOW_TRADE_LEVELS,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_DRAG_TRADE_LEVELS – свойство разрешения на перетаскивание торговых уровней на графике с помощью мышки.

//+------------------------------------------------------------------+
//| Функция определяет, можно ли перетаскивать торговые уровни на |
//| графике при помощи мыши. |
//+------------------------------------------------------------------+
bool ChartDragTradeLevelsGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_DRAG_TRADE_LEVELS,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим перетаскивание торговых уровней |
//| на графике при помощи мыши. |
//+------------------------------------------------------------------+
bool ChartDragTradeLevelsSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_DRAG_TRADE_LEVELS,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHOW_DATE_SCALE – свойство отображения на графике шкалы времени.

//+------------------------------------------------------------------+
//| Функция определяет, отображается ли на графике шкала времени. |
//+------------------------------------------------------------------+
bool ChartShowDateScaleGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SHOW_DATE_SCALE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения шкалы времени на |
//| графике. |
//+------------------------------------------------------------------+
bool ChartShowDateScaleSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SHOW_DATE_SCALE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHOW_PRICE_SCALE – свойство отображения на графике шкалы цены.

//+------------------------------------------------------------------+
//| Функция определяет, отображается ли на графике шкала цены. |
//+------------------------------------------------------------------+
bool ChartShowPriceScaleGet(bool &result,const long chart_ID=0)
{
//--- подготовим переменную для получения значения свойства
long value;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetInteger(chart_ID,CHART_SHOW_PRICE_SCALE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- запомним в переменную значение свойства графика
result=value;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения шкалы цены на |
//| графике. |
//+------------------------------------------------------------------+
bool ChartShowPriceScaleSet(const bool value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetInteger(chart_ID,CHART_SHOW_PRICE_SCALE,0,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_SHIFT_SIZE – размер отступа нулевого бара от правого края в процентах.

//+------------------------------------------------------------------+
//| Функция получает размер отступа нулевого бара от правого края |
//| графика в процентах (от 10% до 50%). |
//+------------------------------------------------------------------+
double ChartShiftSizeGet(const long chart_ID=0)
{
//--- подготовим переменную для получения результата
double result=EMPTY_VALUE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetDouble(chart_ID,CHART_SHIFT_SIZE,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return(result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает размер отступа нулевого бара от правого |
//| края графика в процентах (от 10% до 50%). Для включения режима |
//| отступа, нужно установить значение свойства CHART_SHIFT равным |
//| true. |
//+------------------------------------------------------------------+
bool ChartShiftSizeSet(const double value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetDouble(chart_ID,CHART_SHIFT_SIZE,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_IS_OFFLINE – проверяет автономность текущего графика.

//+------------------------------------------------------------------+
//| Функция проверяет автономность текущего графика |
//+------------------------------------------------------------------+
bool CheckChartOffline(const long chart_ID=0)
{
bool offline=ChartGetInteger(chart_ID,CHART_IS_OFFLINE);
return(offline);
}

  • CHART_FIXED_POSITION – положение фиксированной позиции графика от левого края в процентах.

//+------------------------------------------------------------------+
//| Функция получает положение фиксированной позиции графика от |
//| левого края в процентах. |
//+------------------------------------------------------------------+
double ChartFixedPositionGet(const long chart_ID=0)
{
//--- подготовим переменную для получения результата
double result=EMPTY_VALUE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetDouble(chart_ID,CHART_FIXED_POSITION,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return(result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает положение фиксированной позиции графика от |
//| левого края в процентах. Для того чтобы увидеть положение |
//| фиксированной позиции на графике, нужно предварительно задать |
//| значение свойства CHART_AUTOSCROLL равным false. |
//+------------------------------------------------------------------+
bool ChartFixedPositionSet(const double value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetDouble(chart_ID,CHART_FIXED_POSITION,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_FIXED_MAX – свойство фиксированного максимума графика.

//+------------------------------------------------------------------+
//| Функция получает значение фиксированного максимума графика. |
//+------------------------------------------------------------------+
double ChartFixedMaxGet(const long chart_ID=0)
{
//--- подготовим переменную для получения результата
double result=EMPTY_VALUE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetDouble(chart_ID,CHART_FIXED_MAX,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return(result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает значение фиксированного максимума графика. |
//| Для того чтобы удалось изменить значение этого свойства, нужно |
//| предварительно задать значение свойства CHART_SCALEFIX равным |
//| true. |
//+------------------------------------------------------------------+
bool ChartFixedMaxSet(const double value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetDouble(chart_ID,CHART_FIXED_MAX,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_FIXED_MIN – свойство фиксированного минимума графика.

//+------------------------------------------------------------------+
//| Функция получает значение фиксированного минимума графика. |
//+------------------------------------------------------------------+
double ChartFixedMinGet(const long chart_ID=0)
{
//--- подготовим переменную для получения результата
double result=EMPTY_VALUE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetDouble(chart_ID,CHART_FIXED_MIN,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return(result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает значение фиксированного минимума графика. |
//| Для того чтобы удалось изменить значение этого свойства, нужно |
//| предварительно задать значение свойства CHART_SCALEFIX равным |
//| true. |
//+------------------------------------------------------------------+
bool ChartFixedMinSet(const double value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetDouble(chart_ID,CHART_FIXED_MIN,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_POINTS_PER_BAR – значение масштаба в пунктах на бар.

//+------------------------------------------------------------------+
//| Функция получает значение масштаба графика в пунктах на бар. |
//+------------------------------------------------------------------+
double ChartPointsPerBarGet(const long chart_ID=0)
{
//--- подготовим переменную для получения результата
double result=EMPTY_VALUE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetDouble(chart_ID,CHART_POINTS_PER_BAR,0,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return(result);
}
//+------------------------------------------------------------------+
//| Функция устанавливает значение масштаба графика в пунктах на бар.|
//| Для того чтобы посмотреть результат изменения значения этого |
//| свойства, нужно предварительно задать значение свойства |
//| CHART_SCALE_PT_PER_BAR равным true. |
//+------------------------------------------------------------------+
bool ChartPointsPerBarSet(const double value,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetDouble(chart_ID,CHART_POINTS_PER_BAR,value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

  • CHART_PRICE_MIN – возвращает значение минимума графика.

//+------------------------------------------------------------------+
//| Функция получает значение минимума графика в главном окне или |
//| подокне. |
//+------------------------------------------------------------------+
double ChartPriceMin(const long chart_ID=0,const int sub_window=0)
{
//--- подготовим переменную для получения результата
double result=EMPTY_VALUE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetDouble(chart_ID,CHART_PRICE_MIN,sub_window,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return(result);
}

  • CHART_PRICE_MAX – возвращает значение максимума графика.

//+------------------------------------------------------------------+
//| Функция получает значение максимума графика в главном окне или |
//| подокне. |
//+------------------------------------------------------------------+
double ChartPriceMax(const long chart_ID=0,const int sub_window=0)
{
//--- подготовим переменную для получения результата
double result=EMPTY_VALUE;
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetDouble(chart_ID,CHART_PRICE_MAX,sub_window,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- вернем значение свойства графика
return(result);
}

  • CHART_COMMENT – текст комментария на графике.

//+------------------------------------------------------------------+
//| Функция получает текст комментария в левом верхнем углу графика. |
//+------------------------------------------------------------------+
bool ChartCommentGet(string &result,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- получим значение свойства
if(!ChartGetString(chart_ID,CHART_COMMENT,result))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция устанавливает текст комментария в левом верхнем углу |
//| графика. |
//+------------------------------------------------------------------+
bool ChartCommentSet(const string str,const long chart_ID=0)
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим значение свойства
if(!ChartSetString(chart_ID,CHART_COMMENT,str))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}

Панель для свойств графика

//--- подключим библиотеку элементов управления
#include <ChartObjects\ChartObjectsTxtControls.mqh>
//--- предопределенные константы
#define X_PROPERTY_NAME_1 10 // х-координата имени свойства в первом столбце
#define X_PROPERTY_VALUE_1 225 // x-координата значения свойства в первом столбце
#define X_PROPERTY_NAME_2 345 // x-координата имени свойства во втором и третьем столбцах
#define X_PROPERTY_VALUE_2 550 // x-координата значения свойства во втором и третьем столбце
#define X_BUTTON_1 285 // x-координата кнопки в первом столбце
#define X_BUTTON_2 700 // x-координата кнопки во втором столбце
#define Y_PROPERTY_1 30 // y-координата начала первого и второго столбца
#define Y_PROPERTY_2 286 // y-координата начала третьего столбца
#define Y_DISTANCE 16 // расстояние по оси y между строками
#define LAST_PROPERTY_NUMBER 111 // номер последнего графического свойства
//--- входные параметры
input color InpFirstColor=clrDodgerBlue; // Цвет нечетных строк
input color InpSecondColor=clrGoldenrod; // Цвет четных строк
//--- переменные и массивы
CChartObjectLabel ExtLabelsName[]; // надписи для отображения имен свойств
CChartObjectLabel ExtLabelsValue[]; // надписи для отображения значений свойств
CChartObjectButton ExtButtons[]; // кнопки
int ExtNumbers[]; // индексы свойств
string ExtNames[]; // имена свойств
uchar ExtDataTypes[]; // типы данных свойств (integer, double, string)
uint ExtGroupTypes[]; // массив, который хранит данные о принадлежности свойств к одной из групп
uchar ExtDrawTypes[]; // массив, который хранит данные о способе отображения свойств
double ExtMaxValue[]; // максимальные значения свойств, которые они могут принимать в процессе работы с данной панелью
double ExtMinValue[]; // минимальные значения свойств, которые они могут принимать в процессе работы с данной панелью
double ExtStep[]; // шаги для изменений свойств
int ExtCount; // общее количество всех свойств
color ExtColors[2]; // массив цветов для отображения строк
string ExtComments[2]; // массив комментариев (для свойства CHART_COMMENT)
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- выведем комментарий на график
Comment("SomeComment");
//--- сохраним цвета в массив для дальнейшего переключения между ними
ExtColors[0]=InpFirstColor;
ExtColors[1]=InpSecondColor;
//--- сохраним комментарии в массив для дальнейшего переключения между ними
ExtComments[0]="FirstComment";
ExtComments[1]="SecondComment";
//--- подготовим и отобразим панель управления свойствами графика
if(!PrepareControls())
return(INIT_FAILED);
//--- успешное выполнение
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Deinitialization function of the expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- очищаем текст комментария на графике
Comment("");
}
//+------------------------------------------------------------------+
//| Обработчик событий графика |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- проверка события нажатия на объект графика
if(id==CHARTEVENT_OBJECT_CLICK)
{
//--- разобьем имя объекта по разделителю
string obj_name[];
StringSplit(sparam,'_',obj_name);
//--- проверка, является ли объект кнопкой
if(obj_name[0]=="Button")
{
//--- получаем индекс кнопки
int index=(int)StringToInteger(obj_name[1]);
//--- установим кнопку в ненажатое состояние
ExtButtons[index].State(false);
//--- установим новое значения свойства в зависимости от его типа
if(ExtDataTypes[index]=='I')
ChangeIntegerProperty(index);
if(ExtDataTypes[index]=='D')
ChangeDoubleProperty(index);
if(ExtDataTypes[index]=='S')
ChangeStringProperty(index);
}
}
//--- перерисовка значений свойств
RedrawProperties();
ChartRedraw();
}
//+------------------------------------------------------------------+
//| Изменение целочисленного свойства графика |
//+------------------------------------------------------------------+
void ChangeIntegerProperty(const int index)
{
//--- получаем текущее значение свойства
long value=ChartGetInteger(0,(ENUM_CHART_PROPERTY_INTEGER)ExtNumbers[index]);
//--- определяем следующее значение свойства
switch(ExtDrawTypes[index])
{
case 'C':
value=GetNextColor((color)value);
break;
default:
value=(long)GetNextValue((double)value,index);
break;
}
//--- устанавливаем новое значение свойства
ChartSetInteger(0,(ENUM_CHART_PROPERTY_INTEGER)ExtNumbers[index],0,value);
}
//+------------------------------------------------------------------+
//| Изменение вещественного свойства графика |
//+------------------------------------------------------------------+
void ChangeDoubleProperty(const int index)
{
//--- получаем текущее значение свойства
double value=ChartGetDouble(0,(ENUM_CHART_PROPERTY_DOUBLE)ExtNumbers[index]);
//--- определяем следующее значение свойства
value=GetNextValue(value,index);
//--- устанавливаем новое значение свойства
ChartSetDouble(0,(ENUM_CHART_PROPERTY_DOUBLE)ExtNumbers[index],value);
}
//+------------------------------------------------------------------+
//| Изменение строкового свойства графика |
//+------------------------------------------------------------------+
void ChangeStringProperty(const int index)
{
//--- статическая переменная для переключения внутри массива комментариев ExtComments
static uint comment_index=1;
//--- меняем индекс для получения другого комментария
comment_index=1-comment_index;
//--- устанавливаем новое значение свойства
ChartSetString(0,(ENUM_CHART_PROPERTY_STRING)ExtNumbers[index],ExtComments[comment_index]);
}
//+------------------------------------------------------------------+
//| Определение следующего значения свойства |
//+------------------------------------------------------------------+
double GetNextValue(const double value,const int index)
{
if(value+ExtStep[index]<=ExtMaxValue[index])
return(value+ExtStep[index]);
else
return(ExtMinValue[index]);
}
//+------------------------------------------------------------------+
//| Получение следующего цвета для свойства типа color |
//+------------------------------------------------------------------+
color GetNextColor(const color clr)
{
//--- вернем следующее значение цвета
switch(clr)
{
case clrWhite: return(clrRed);
case clrRed: return(clrGreen);
case clrGreen: return(clrBlue);
case clrBlue: return(clrBlack);
default: return(clrWhite);
}
}
//+------------------------------------------------------------------+
//| Перерисовка значений свойств |
//+------------------------------------------------------------------+
void RedrawProperties(void)
{
//--- текст значения свойства
string text;
long value;
//--- цикл по количеству свойств
for(int i=0;i<ExtCount;i++)
{
text="";
switch(ExtDataTypes[i])
{
case 'I':
//--- получаем текущее значение свойства
if(!ChartGetInteger(0,(ENUM_CHART_PROPERTY_INTEGER)ExtNumbers[i],0,value))
break;
//--- текст целочисленного свойства
switch(ExtDrawTypes[i])
{
//--- свойство цвета
case 'C':
text=(string)((color)value);
break;
//--- булевое свойство
case 'B':
text=(string)((bool)value);
break;
//--- свойство перечисления ENUM_CHART_MODE
case 'M':
text=EnumToString((ENUM_CHART_MODE)value);
break;
//--- свойство перечисления ENUM_CHART_VOLUME_MODE
case 'V':
text=EnumToString((ENUM_CHART_VOLUME_MODE)value);
break;
//--- число типа int
default:
text=IntegerToString(value);
break;
}
break;
case 'D':
//--- текст вещественного свойства
text=DoubleToString(ChartGetDouble(0,(ENUM_CHART_PROPERTY_DOUBLE)ExtNumbers[i]),4);
break;
case 'S':
//--- текст строкового свойства
text=ChartGetString(0,(ENUM_CHART_PROPERTY_STRING)ExtNumbers[i]);
break;
}
//--- отобразим значение свойства
ExtLabelsValue[i].Description(text);
}
}
//+------------------------------------------------------------------+
//| Создание панели для управления свойствами графика |
//+------------------------------------------------------------------+
bool PrepareControls(void)
{
//--- выделим память под массивы с запасом
MemoryAllocation(LAST_PROPERTY_NUMBER+1);
//--- переменные
int i=0; // переменная цикла
int col_1=0; // количество свойств в первом столбце
int col_2=0; // количество свойств во втором столбце
int col_3=0; // количество свойств в третьем столбце
//--- текущее количество свойств - 0
ExtCount=0;
//--- ищем свойства в цикле
while(i<=LAST_PROPERTY_NUMBER)
{
//--- запомним текущий номер свойства
ExtNumbers[ExtCount]=i;
//--- увеличим значение переменной цикла
i++;
//--- проверим, есть ли свойство с таким номером
if(CheckNumber(ExtNumbers[ExtCount],ExtNames[ExtCount],ExtDataTypes[ExtCount],ExtGroupTypes[ExtCount],ExtDrawTypes[ExtCount]))
{
//--- создаем элементы управления для свойства
switch(ExtGroupTypes[ExtCount])
{
case 1:
//--- создаем надписи и кнопку для свойства
if(!ShowProperty(ExtCount,0,X_PROPERTY_NAME_1,X_PROPERTY_VALUE_1,X_BUTTON_1,Y_PROPERTY_1+col_1*Y_DISTANCE,true))
return(false);
//--- количество элементов в первом столбце увеличилось
col_1++;
break;
case 2:
//--- создаем надписи и кнопку для свойства
if(!ShowProperty(ExtCount,1,X_PROPERTY_NAME_2,X_PROPERTY_VALUE_2,X_BUTTON_2,Y_PROPERTY_1+col_2*Y_DISTANCE,true))
return(false);
//--- количество элементов во втором столбце увеличилось
col_2++;
break;
case 3:
//--- создаем только надписи для свойства
if(!ShowProperty(ExtCount,2,X_PROPERTY_NAME_2,X_PROPERTY_VALUE_2,0,Y_PROPERTY_2+col_3*Y_DISTANCE,false))
return(false);
//--- количество элементов в третьем столбце увеличилось
col_3++;
break;
}
//--- определим максимальное, минимальное значение свойства и шаг
GetMaxMinStep(ExtNumbers[ExtCount],ExtMaxValue[ExtCount],ExtMinValue[ExtCount],ExtStep[ExtCount]);
//--- увеличим количество свойств
ExtCount++;
}
}
//--- освободим память, которая не используется массивами
MemoryAllocation(ExtCount);
//--- перерисуем значения свойств
RedrawProperties();
ChartRedraw();
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Выделение памяти для массивов |
//+------------------------------------------------------------------+
void MemoryAllocation(const int size)
{
ArrayResize(ExtLabelsName,size);
ArrayResize(ExtLabelsValue,size);
ArrayResize(ExtButtons,size);
ArrayResize(ExtNumbers,size);
ArrayResize(ExtNames,size);
ArrayResize(ExtDataTypes,size);
ArrayResize(ExtGroupTypes,size);
ArrayResize(ExtDrawTypes,size);
ArrayResize(ExtMaxValue,size);
ArrayResize(ExtMinValue,size);
ArrayResize(ExtStep,size);
}
//+------------------------------------------------------------------+
//| Проверяем индекс свойства на принадлежность к одному из |
//| перечислений ENUM_CHART_PROPERTIES |
//+------------------------------------------------------------------+
bool CheckNumber(const int ind,string &name,uchar &data_type,uint &group_type,uchar &draw_type)
{
//--- проверяем, является ли свойство целочисленным
ResetLastError();
name=EnumToString((ENUM_CHART_PROPERTY_INTEGER)ind);
if(_LastError==0)
{
data_type='I'; // свойство из перечисления ENUM_CHART_PROPERTY_INTEGER
GetTypes(ind,group_type,draw_type); // определим параметры отображения свойства
return(true);
}
//--- проверяем, является ли свойство вещественным
ResetLastError();
name=EnumToString((ENUM_CHART_PROPERTY_DOUBLE)ind);
if(_LastError==0)
{
data_type='D'; // свойство из перечисления ENUM_CHART_PROPERTY_DOUBLE
GetTypes(ind,group_type,draw_type); // определим параметры отображения свойства
return(true);
}
//--- проверяем, является ли свойство строковым
ResetLastError();
name=EnumToString((ENUM_CHART_PROPERTY_STRING)ind);
if(_LastError==0)
{
data_type='S'; // свойство из перечисления ENUM_CHART_PROPERTY_STRING
GetTypes(ind,group_type,draw_type); // определим параметры отображения свойства
return(true);
}
//--- свойство не принадлежит ни одному перечислению
return(false);
}
//+------------------------------------------------------------------+
//| Определение того, в какой группе должно находиться свойство, |
//| и его тип отображения |
//+------------------------------------------------------------------+
void GetTypes(const int property_number,uint &group_type,uchar &draw_type)
{
//--- проверим на принадлежность свойства к третьей группе
//--- свойства третьей группы отображаются во втором столбце, начиная с CHART_BRING_TO_TOP
if(CheckThirdGroup(property_number,group_type,draw_type))
return;
//--- проверим на принадлежность свойства ко второй группе
//--- свойства второй группы отображаются во втором столбце с начала
if(CheckSecondGroup(property_number,group_type,draw_type))
return;
//--- если попали сюда, значит свойство принадлежит первой группе (первый столбец)
CheckFirstGroup(property_number,group_type,draw_type);
}
//+------------------------------------------------------------------+
//| Функция проверяет, принадлежит ли свойство третьей группе, и |
//| если да, то определяет его тип отображения |
//+------------------------------------------------------------------+
bool CheckThirdGroup(const int property_number,uint &group_type,uchar &draw_type)
{
//--- проверим свойство на принадлежность к третьей группе
switch(property_number)
{
//--- булевые свойства
case CHART_WINDOW_IS_VISIBLE:
draw_type='B';
break;
//--- целочисленные свойства
case CHART_VISIBLE_BARS:
case CHART_WINDOWS_TOTAL:
case CHART_WINDOW_HANDLE:
case CHART_WINDOW_YDISTANCE:
case CHART_FIRST_VISIBLE_BAR:
case CHART_WIDTH_IN_BARS:
case CHART_WIDTH_IN_PIXELS:
draw_type='I';
break;
//--- вещественные свойства
case CHART_PRICE_MIN:
case CHART_PRICE_MAX:
draw_type='D';
break;
//--- по сути, это свойство является командой показа графика поверх всех других
//--- для данной панели в его применении нет необходимости, так как окно всегда
//--- будет становиться поверх всех других раньше, чем мы используем его
case CHART_BRING_TO_TOP:
draw_type=' ';
break;
//--- свойство не принадлежит к третьей группе
default:
return(false);
}
//--- свойство принадлежит к третьей группе
group_type=3;
return(true);
}
//+------------------------------------------------------------------+
//| Функция проверяет, принадлежит ли свойство второй группе, и если |
//| да, то определяет его тип отображения |
//+------------------------------------------------------------------+
bool CheckSecondGroup(const int property_number,uint &group_type,uchar &draw_type)
{
//--- проверим свойство на принадлежность ко второй группе
switch(property_number)
{
//--- свойство типа ENUM_CHART_MODE
case CHART_MODE:
draw_type='M';
break;
//--- свойство типа ENUM_CHART_VOLUME_MODE
case CHART_SHOW_VOLUMES:
draw_type='V';
break;
//--- строковое свойство
case CHART_COMMENT:
draw_type='S';
break;
//--- свойство цвета
case CHART_COLOR_BACKGROUND:
case CHART_COLOR_FOREGROUND:
case CHART_COLOR_GRID:
case CHART_COLOR_VOLUME:
case CHART_COLOR_CHART_UP:
case CHART_COLOR_CHART_DOWN:
case CHART_COLOR_CHART_LINE:
case CHART_COLOR_CANDLE_BULL:
case CHART_COLOR_CANDLE_BEAR:
case CHART_COLOR_BID:
case CHART_COLOR_ASK:
case CHART_COLOR_LAST:
case CHART_COLOR_STOP_LEVEL:
draw_type='C';
break;
//--- свойство не принадлежит ко второй группе
default:
return(false);
}
//--- свойство принадлежит ко второй группе
group_type=2;
return(true);
}
//+------------------------------------------------------------------+
//| Эта функция вызывается только в том случае, если уже известно, |
//| что свойство не принадлежит второй и третьей группам свойств |
//+------------------------------------------------------------------+
void CheckFirstGroup(const int property_number,uint &group_type,uchar &draw_type)
{
//--- свойство принадлежит первой группе
group_type=1;
//--- определим тип отображения свойства
switch(property_number)
{
//--- целочисленные свойства
case CHART_SCALE:
case CHART_HEIGHT_IN_PIXELS:
draw_type='I';
return;
//--- вещественные свойства
case CHART_SHIFT_SIZE:
case CHART_FIXED_POSITION:
case CHART_FIXED_MAX:
case CHART_FIXED_MIN:
case CHART_POINTS_PER_BAR:
draw_type='D';
return;
//--- остались только булевые свойства
default:
draw_type='B';
return;
}
}
//+------------------------------------------------------------------+
//| Создание надписи и кнопки для свойства |
//+------------------------------------------------------------------+
bool ShowProperty(const int ind,const int type,const int x1,const int x2,
const int xb,const int y,const bool btn)
{
//--- статический массив для переключения внутри массива цвета ExtColors
static uint color_index[3]={1,1,1};
//--- меняем индекс для получения другого цвета
color_index[type]=1-color_index[type];
//--- выведем надписи и кнопку (если btn=true) для свойства
if(!LabelCreate(ExtLabelsName[ind],"name_"+(string)ind,ExtNames[ind],ExtColors[color_index[type]],x1,y))
return(false);
if(!LabelCreate(ExtLabelsValue[ind],"value_"+(string)ind,"",ExtColors[color_index[type]],x2,y))
return(false);
if(btn && !ButtonCreate(ExtButtons[ind],(string)ind,xb,y+1))
return(false);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Создание надписи |
//+------------------------------------------------------------------+
bool LabelCreate(CChartObjectLabel &lbl,const string name,const string text,
const color clr,const int x,const int y)
{
if(!lbl.Create(0,"Label_"+name,0,x,y)) return(false);
if(!lbl.Description(text)) return(false);
if(!lbl.FontSize(10)) return(false);
if(!lbl.Color(clr)) return(false);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Создание кнопки |
//+------------------------------------------------------------------+
bool ButtonCreate(CChartObjectButton &btn,const string name,
const int x,const int y)
{
if(!btn.Create(0,"Button_"+name,0,x,y,50,15)) return(false);
if(!btn.Description("Next")) return(false);
if(!btn.FontSize(10)) return(false);
if(!btn.Color(clrBlack)) return(false);
if(!btn.BackColor(clrWhite)) return(false);
if(!btn.BorderColor(clrBlack)) return(false);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Устанавливаем максимальное, минимальное значение свойства и шаг |
//+------------------------------------------------------------------+
void GetMaxMinStep(const int property_number,double &max,double &min,double &step)
{
double value;
//--- установим значения в зависимости от типа свойства
switch(property_number)
{
case CHART_SCALE:
max=5;
min=0;
step=1;
break;
case CHART_MODE:
case CHART_SHOW_VOLUMES:
max=2;
min=0;
step=1;
break;
case CHART_SHIFT_SIZE:
max=50;
min=10;
step=2.5;
break;
case CHART_FIXED_POSITION:
max=90;
min=0;
step=15;
break;
case CHART_POINTS_PER_BAR:
max=19;
min=1;
step=3;
break;
case CHART_FIXED_MAX:
value=ChartGetDouble(0,CHART_FIXED_MAX);
max=value*1.25;
min=value;
step=value/32;
break;
case CHART_FIXED_MIN:
value=ChartGetDouble(0,CHART_FIXED_MIN);
max=value;
min=value*0.75;
step=value/32;
break;
case CHART_HEIGHT_IN_PIXELS:
max=700;
min=520;
step=30;
break;
//--- значения по умолчанию
default:
max=1;
min=0;
step=1;
}
}


Константы объектов

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов

Константы объектов

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

  • Типы объектов – идентификаторы графических объектов;
  • Свойства объектов – работа со свойствами графических объектов;
  • Способы привязки объектов – константы позиционирования объектов на графике;
  • Угол привязки – позволяет установить угла графика, относительно которого производится позиционирование объекта в пикселях;
  • Видимость объектов – задание таймфреймов, на которых объект является видимым;
  • Объекты Ганна – константы тренда для веера Ганна и сетки Ганна;
  • Набор Web-цветов – константы предопределенных Web-цветов;
  • Wingdings – коды символов шрифта Wingdings.

Что нового в MQL5

В MQL5 в добавлены новые объекты и аналитические инструменты. Среди них наиболее интересным является новый графический объект OBJ_CHART, который является фактически полноценным графиком. С его помощью которого можно создать сколь угодно вложенных графиков и задать им все необходимые свойства – цветую схему, таймфрейм, символ и даже наложить на них индикаторы.

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

Идентификатор | Описание | Тип свойства
OBJPROP_FILL | Заливка объекта цветом (для OBJ_RECTANGLE, OBJ_TRIANGLE, OBJ_ELLIPSE, OBJ_CHANNEL, OBJ_STDDEVCHANNEL, OBJ_REGRESSION) | bool
OBJPROP_SELECTABLE | Доступность объекта | bool
OBJPROP_CREATETIME | Время создания объекта | datetime r/o
OBJPROP_RAY_LEFT | Луч продолжается влево | bool
OBJPROP_ANCHOR | Положение точки привязки графического объекта | ENUM_ARROW_ANCHOR ENUM_ANCHOR_POINT
OBJPROP_STATE | Состояние кнопки (Нажата/Отжата) | bool
OBJPROP_CHART_ID | Идентификатор объекта "График" (OBJ_CHART). Позволяет работать со свойствами этого объекта как с обычным графиком с помощью функций из раздела Операции с графиками, но есть некоторые исключения. | long r/o
OBJPROP_PERIOD | Период для объекта "График" | ENUM_TIMEFRAMES
OBJPROP_DATE_SCALE | Признак отображения шкалы времени для объекта "График" | bool
OBJPROP_PRICE_SCALE | Признак отображения ценовой шкалы для объекта "График" | bool
OBJPROP_CHART_SCALE | Масштаб для объекта "График" | int значение в диапазоне 0–5


Типы объектов

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов

Типы объектов

При создании графического объекта функцией ObjectCreate() необходимо указать тип создаваемого объекта, который может принимать одно из значений перечисления ENUM_OBJECT. Идентификаторы типов графических объектов используются в функциях ObjectCreate(), ObjectsDeleteAll() и ObjectType().

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

ENUM_OBJECT

Идентификатор |  | Описание
OBJ_VLINE |  | Вертикальная линия
OBJ_HLINE |  | Горизонтальная линия
OBJ_TREND |  | Трендовая линия
OBJ_TRENDBYANGLE |  | Трендовая линия по углу
OBJ_CYCLES |  | Циклические линии
OBJ_CHANNEL |  | Равноудаленный канал
OBJ_STDDEVCHANNEL |  | Канал стандартного отклонения
OBJ_REGRESSION |  | Канал на линейной регрессии
OBJ_PITCHFORK | andrewspitchfork | Вилы Эндрюса
OBJ_GANNLINE |  | Линия Ганна
OBJ_GANNFAN |  | Веер Ганна
OBJ_GANNGRID |  | Сетка Ганна
OBJ_FIBO |  | Уровни Фибоначчи
OBJ_FIBOTIMES |  | Временные зоны Фибоначчи
OBJ_FIBOFAN |  | Веер Фибоначчи
OBJ_FIBOARC |  | Дуги Фибоначчи
OBJ_FIBOCHANNEL |  | Канал Фибоначчи
OBJ_EXPANSION |  | Расширение Фибоначчи
OBJ_RECTANGLE | rectangle | Прямоугольник
OBJ_TRIANGLE | triangle | Треугольник
OBJ_ELLIPSE | ellipse | Эллипс
OBJ_ARROW_THUMB_UP |  | Знак "Хорошо" (большой палец вверх)
OBJ_ARROW_THUMB_DOWN |  | Знак "Плохо" (большой палец вниз)
OBJ_ARROW_UP |  | Знак "Стрелка вверх"
OBJ_ARROW_DOWN |  | Знак "Стрелка вниз"
OBJ_ARROW_STOP |  | Знак "Стоп"
OBJ_ARROW_CHECK |  | Знак "Птичка" (галка)
OBJ_ARROW_LEFT_PRICE |  | Левая ценовая метка
OBJ_ARROW_RIGHT_PRICE |  | Правая ценовая метка
OBJ_ARROW_BUY |  | Знак "Buy"
OBJ_ARROW_SELL |  | Знак "Sell"
OBJ_ARROW |  | Объект "Стрелка"
OBJ_TEXT |  | Объект "Текст"
OBJ_LABEL |  | Объект "Текстовая метка"
OBJ_BUTTON |  | Объект "Кнопка"
OBJ_BITMAP |  | Объект "Рисунок"
OBJ_BITMAP_LABEL |  | Объект "Графическая метка"
OBJ_EDIT |  | Объект "Поле ввода"
OBJ_EVENT |  | Объект "Событие", соответствующий событию в экономическом календаре
OBJ_RECTANGLE_LABEL |  | Объект "Прямоугольная метка"для создания и оформления пользовательского графического интерфейса.


OBJ_VLINE

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_VLINE

OBJ_VLINE

Вертикальная линия.

Пример

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

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Вертикальная линия\"."
#property description "Дата точки привязки задается в процентах от ширины"
#property description "окна графика в барах."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="VLine"; // Имя линии
input int InpDate=25; // Дата линии в %
input color InpColor=clrRed; // Цвет линии
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линии
input int InpWidth=1; // Толщина линии
input bool InpBack=false; // Линия на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает вертикальную линию |
//+------------------------------------------------------------------+
bool VLineCreate(const long chart_ID=0, // ID графика
const string name="VLine", // имя линии
const int sub_window=0, // номер подокна
datetime time=0, // время линии
const color clr=clrRed, // цвет линии
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
const int width=1, // толщина линии
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- если время линии не задано, то проводим ее через последний бар
if(!time)
time=TimeCurrent();
//--- сбросим значение ошибки
ResetLastError();
//--- создадим вертикальную линию
if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0))
{
Print(__FUNCTION__,
": не удалось создать вертикальную линию! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет линии
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещение вертикальной линии |
//+------------------------------------------------------------------+
bool VLineMove(const long chart_ID=0, // ID графика
const string name="VLine", // имя линии
datetime time=0) // время линии
{
//--- если время линии не задано, то перемещаем ее на последний бар
if(!time)
time=TimeCurrent();
//--- сбросим значение ошибки
ResetLastError();
//--- переместим вертикальную линию
if(!ObjectMove(chart_ID,name,0,time,0))
{
Print(__FUNCTION__,
": не удалось переместить вертикальную линию! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет вертикальную линию |
//+------------------------------------------------------------------+
bool VLineDelete(const long chart_ID=0, // ID графика
const string name="VLine") // имя линии
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим вертикальную линию
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить вертикальную линию! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate<0 || InpDate>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- массив для хранения значений дат, которые будут использованы
//--- для установки и изменения координаты точки привязки линии
datetime date[];
//--- выделение памяти
ArrayResize(date,bars);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- определим точки для рисования линии
int d=InpDate*(bars-1)/100;
//--- создадим вертикальную линию
if(!VLineCreate(0,InpName,0,date[d],InpColor,InpStyle,InpWidth,InpBack,
InpSelection,InpHidden,InpZOrder))
return;
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать линию
//--- счетчик цикла
int h_steps=bars/2;
//--- перемещаем линию
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d<bars-1)
d+=1;
//--- сдвигаем точку
if(!VLineMove(0,InpName,date[d]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.03 секунды
Sleep(30);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим канал с графика
VLineDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_HLINE

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_HLINE

OBJ_HLINE

Горизонтальная линия.

Пример

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

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Горизонтальная линия\"."
#property description "Цена точки привязки задается в процентах от высоты"
#property description "окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="HLine"; // Имя линии
input int InpPrice=25; // Цена линии в %
input color InpColor=clrRed; // Цвет линии
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линии
input int InpWidth=1; // Толщина линии
input bool InpBack=false; // Линия на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает горизонтальную линию |
//+------------------------------------------------------------------+
bool HLineCreate(const long chart_ID=0, // ID графика
const string name="HLine", // имя линии
const int sub_window=0, // номер подокна
double price=0, // цена линии
const color clr=clrRed, // цвет линии
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
const int width=1, // толщина линии
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- если цена не задана, то установим ее на уровне текущей цены Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим горизонтальную линию
if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
{
Print(__FUNCTION__,
": не удалось создать горизонтальную линию! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет линии
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещение горизонтальной линии |
//+------------------------------------------------------------------+
bool HLineMove(const long chart_ID=0, // ID графика
const string name="HLine", // имя линии
double price=0) // цена линии
{
//--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим горизонтальную линию
if(!ObjectMove(chart_ID,name,0,0,price))
{
Print(__FUNCTION__,
": не удалось переместить горизонтальную линию! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет горизонтальную линию |
//+------------------------------------------------------------------+
bool HLineDelete(const long chart_ID=0, // ID графика
const string name="HLine") // имя линии
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим горизонтальную линию
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить горизонтальную линию! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpPrice<0 || InpPrice>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- размер массива price
int accuracy=1000;
//--- массив для хранения значений цен, которые будут использованы
//--- для установки и изменения координаты точки привязки линии
double price[];
//--- выделение памяти
ArrayResize(price,accuracy);
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования линии
int p=InpPrice*(accuracy-1)/100;
//--- создадим горизонтальную линию
if(!HLineCreate(0,InpName,0,price[p],InpColor,InpStyle,InpWidth,InpBack,
InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать линию
//--- счетчик цикла
int v_steps=accuracy/2;
//--- перемещаем линию
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p<accuracy-1)
p+=1;
//--- сдвигаем точку
if(!HLineMove(0,InpName,price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим с графика
HLineDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_TREND

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_TREND

OBJ_TREND

Трендовая линия.

Примечание

Для трендовой линии можно указать режим продолжения ее отображения вправо (свойство OBJPROP_RAY_RIGHT).

Пример

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

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Трендовая линия\"."
#property description "Координаты точек привязки задаются в процентах от"
#property description "размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Trend"; // Имя линии
input int InpDate1=35; // Дата 1-ой точки в %
input int InpPrice1=60; // Цена 1-ой точки в %
input int InpDate2=65; // Дата 2-ой точки в %
input int InpPrice2=40; // Цена 2-ой точки в %
input color InpColor=clrRed; // Цвет линии
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линии
input int InpWidth=1; // Толщина линии
input bool InpBack=false; // Линия на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpRayRight=false; // Продолжение линии вправо
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает линию тренда по заданным координатам |
//+------------------------------------------------------------------+
bool TrendCreate(const long chart_ID=0, // ID графика
const string name="TrendLine", // имя линии
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
const color clr=clrRed, // цвет линии
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
const int width=1, // толщина линии
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool ray_right=false, // продолжение линии вправо
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeTrendEmptyPoints(time1,price1,time2,price2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим трендовую линию по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_TREND,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": не удалось создать линию тренда! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет линии
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- включим (true) или отключим (false) режим продолжения отображения линии вправо
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки линии тренда |
//+------------------------------------------------------------------+
bool TrendPointChange(const long chart_ID=0, // ID графика
const string name="TrendLine", // имя линии
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки линии тренда
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция удаляет линию тренда с графика. |
//+------------------------------------------------------------------+
bool TrendDelete(const long chart_ID=0, // ID графика
const string name="TrendLine") // имя линии
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим линию тренда
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить линию тренда! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки линии тренда и для пустых |
//| значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeTrendEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- если время первой точки не задано, то она будет на текущем баре
if(!time1)
time1=TimeCurrent();
//--- если цена первой точки не задана, то она будет иметь значение Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время второй точки не задано, то она лежит на 9 баров левее второй
if(!time2)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- установим вторую точку на 9 баров левее первой
time2=temp[0];
}
//--- если цена второй точки не задана, то она совпадает с ценой первой точки
if(!price2)
price2=price1;
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки линии
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования линии
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- создадим линию тренда
if(!TrendCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,InpStyle,
InpWidth,InpBack,InpSelection,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки линии
//--- счетчик цикла
int v_steps=accuracy/5;
//--- перемещаем первую точку привязки по вертикали
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p1>1)
p1-=1;
//--- сдвигаем точку
if(!TrendPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- перемещаем вторую точку привязки по вертикали
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p2<accuracy-1)
p2+=1;
//--- сдвигаем точку
if(!TrendPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в полсекунды
Sleep(500);
//--- счетчик цикла
int h_steps=bars/2;
//--- перемещаем обе точки привязки по горизонтали одновременно
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующие значения
if(d1<bars-1)
d1+=1;
if(d2>1)
d2-=1;
//--- сдвигаем точки
if(!TrendPointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!TrendPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.03 секунды
Sleep(30);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим трендовую линию
TrendDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_TRENDBYANGLE

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_TRENDBYANGLE

OBJ_TRENDBYANGLE

Трендовая линия по углу.

Примечание

Для трендовой линии можно указать режим продолжения ее отображения вправо (свойство OBJPROP_RAY_RIGHT).

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

Пример

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

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Трендовая линия по углу\"."
#property description "Координаты точек привязки задаются в процентах от размеров"
#property description "окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Trend"; // Имя линии
input int InpDate1=50; // Дата 1-ой точки в %
input int InpPrice1=75; // Цена 1-ой точки в %
input int InpAngle=0; // Угол наклона линии
input color InpColor=clrRed; // Цвет линии
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линии
input int InpWidth=1; // Толщина линии
input bool InpBack=false; // Линия на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpRayRight=true; // Продолжение линии вправо
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает линию тренда по углу |
//+------------------------------------------------------------------+
bool TrendByAngleCreate(const long chart_ID=0, // ID графика
const string name="TrendLine", // имя линии
const int sub_window=0, // номер подокна
datetime time=0, // время точки
double price=0, // цена точки
const double angle=45.0, // угол наклона
const color clr=clrRed, // цвет линии
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
const int width=1, // толщина линии
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool ray_right=true, // продолжение линии вправо
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- для того, чтобы было удобно перемещать трендовую линию мышью, создадим вторую точку
datetime time2=0;
double price2=0;
//--- установим координаты точек привязки, если они не заданы
ChangeTrendEmptyPoints(time,price,time2,price2);
//--- сбросим значение ошибки
ResetLastError();
//--- строим трендовую линию по 2-ум точкам
if(!ObjectCreate(chart_ID,name,OBJ_TRENDBYANGLE,sub_window,time,price,time2,price2))
{
Print(__FUNCTION__,
": не удалось создать линию тренда! Код ошибки = ",GetLastError());
return(false);
}
//--- изменяем угол наклона трендовой линии; в процессе изменения угла, координата второй
//--- точки линии переопределится автоматически в соответствии с новым значением угла
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- установим цвет линии
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- включим (true) или отключим (false) режим продолжения отображения линии вправо
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет координаты точки привязки линии тренда |
//+------------------------------------------------------------------+
bool TrendPointChange(const long chart_ID=0, // ID графика
const string name="TrendLine", // имя линии
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки линии тренда
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет угол наклона линии тренда |
//+------------------------------------------------------------------+
bool TrendAngleChange(const long chart_ID=0, // ID графика
const string name="TrendLine", // имя линии тренда
const double angle=45) // угол наклона линии тренда
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим угол наклона линии тренда
if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle))
{
Print(__FUNCTION__,
": не удалось изменить угол наклона линии! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет линию тренда |
//+------------------------------------------------------------------+
bool TrendDelete(const long chart_ID=0, // ID графика
const string name="TrendLine") // имя линии
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим линию тренда
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить линию тренда! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки линии тренда и для пустых |
//| значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeTrendEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- если время первой точки не задано, то она будет на текущем баре
if(!time1)
time1=TimeCurrent();
//--- если цена первой точки не задана, то она будет иметь значение Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- установим координаты второй, вспомогательной точки
//--- вторая точка будет лежать левее на 9 баров и иметь ту же цену
datetime second_point_time[10];
CopyTime(Symbol(),Period(),time1,10,second_point_time);
time2=second_point_time[0];
price2=price1;
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки линии
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования линии
int d1=InpDate1*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//--- создадим линию тренда
if(!TrendByAngleCreate(0,InpName,0,date[d1],price[p1],InpAngle,InpColor,InpStyle,
InpWidth,InpBack,InpSelection,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать и вращать линию
//--- счетчик цикла
int v_steps=accuracy/2;
//--- перемещаем точку привязки и изменяем угол наклона линии
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p1>1)
p1-=1;
//--- сдвигаем точку
if(!TrendPointChange(0,InpName,date[d1],price[p1]))
return;
if(!TrendAngleChange(0,InpName,18*(i+1)))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим с графика
TrendDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_CYCLES

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CYCLES

OBJ_CYCLES

Циклические линии.

Примечание

Расстояние между линиями задается координатами времени двух точек привязки объекта.

Пример

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

#property strict
//--- описание
#property description "Скрипт строит циклические линии на графике."
#property description "Координаты точек привязки задаются в процентах"
#property description "от размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Cycles"; // Имя объекта
input int InpDate1=10; // Дата 1-ой точки в %
input int InpPrice1=45; // Цена 1-ой точки в %
input int InpDate2=20; // Дата 2-ой точки в %
input int InpPrice2=55; // Цена 2-ой точки в %
input color InpColor=clrRed; // Цвет циклических линий
input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Стиль циклических линий
input int InpWidth=1; // Толщина циклических линий
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает циклические линии |
//+------------------------------------------------------------------+
bool CyclesCreate(const long chart_ID=0, // ID графика
const string name="Cycles", // имя объекта
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
const color clr=clrRed, // цвет циклических линий
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль циклических линий
const int width=1, // толщина циклических линий
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeCyclesEmptyPoints(time1,price1,time2,price2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим циклические линии по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_CYCLES,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": не удалось создать циклические линии! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет линий
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линий
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линий мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool CyclesPointChange(const long chart_ID=0, // ID графика
const string name="Cycles", // имя объекта
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет циклические линии |
//+------------------------------------------------------------------+
bool CyclesDelete(const long chart_ID=0, // ID графика
const string name="Cycles") // имя объекта
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим циклические линии
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить циклические линии! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки циклических линий и для пустых |
//| значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeCyclesEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- если время первой точки не задано, то она будет на текущем баре
if(!time1)
time1=TimeCurrent();
//--- если цена первой точки не задана, то она будет иметь значение Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время второй точки не задано, то она лежит на 9 баров левее второй
if(!time2)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- установим вторую точку на 9 баров левее первой
time2=temp[0];
}
//--- если цена второй точки не задана, то она совпадает с ценой первой точки
if(!price2)
price2=price1;
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки циклических линий
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования циклических линий
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- создадим линию тренда
if(!CyclesCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки
//--- счетчик цикла
int h_steps=bars/5;
//--- перемещаем вторую точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d2<bars-1)
d2+=1;
//--- сдвигаем точку
if(!CyclesPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
h_steps=bars/4;
//--- перемещаем первую точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d1<bars-1)
d1+=1;
//--- сдвигаем точку
if(!CyclesPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим объект с графика
CyclesDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_CHANNEL

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHANNEL

OBJ_CHANNEL

Равноудаленный канал.

Примечание

Для равноудаленного канала можно указать режим продолжения его отображения вправо (свойство OBJPROP_RAY_RIGHT). Также можно установить режим заливки канала цветом.

Пример

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

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Равноудаленный канал\"."
#property description "Координаты точек привязки задаются в процентах от размеров"
#property description "окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Channel"; // Имя канала
input int InpDate1=25; // Дата 1-ой точки в %
input int InpPrice1=60; // Цена 1-ой точки в %
input int InpDate2=65; // Дата 2-ой точки в %
input int InpPrice2=80; // Цена 2-ой точки в %
input int InpDate3=30; // Дата 3-ей точки в %
input int InpPrice3=40; // Цена 3-ей точки в %
input color InpColor=clrRed; // Цвет канала
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линий канала
input int InpWidth=1; // Толщина линий канала
input bool InpBack=false; // Канал на заднем плане
input bool InpFill=false; // Заливка канала цветом
input bool InpSelection=true; // Выделить для перемещений
input bool InpRayRight=false; // Продолжение канала вправо
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Cоздает равноудаленный канал по заданным координатам |
//+------------------------------------------------------------------+
bool ChannelCreate(const long chart_ID=0, // ID графика
const string name="Channel", // имя канала
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
datetime time3=0, // время третьей точки
double price3=0, // цена третьей точки
const color clr=clrRed, // цвет канала
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий канала
const int width=1, // толщина линий канала
const bool fill=false, // заливка канала цветом
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool ray_right=false, // продолжение канала вправо
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeChannelEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим канал по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_CHANNEL,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": не удалось создать равноудаленный канал! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет канала
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линий канала
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий канала
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения канала для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- включим (true) или отключим (false) режим продолжения отображения канала вправо
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки канала |
//+------------------------------------------------------------------+
bool ChannelPointChange(const long chart_ID=0, // ID графика
const string name="Channel", // имя канала
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет канал |
//+------------------------------------------------------------------+
bool ChannelDelete(const long chart_ID=0, // ID графика
const string name="Channel") // имя канала
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим канал
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить канал! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки канала и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//--- если время второй (правой) точки не задано, то она будет на текущем баре
if(!time2)
time2=TimeCurrent();
//--- если цена второй точки не задана, то она будет иметь значение Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время первой (левой) точки не задано, то она лежит на 9 баров левее второй
if(!time1)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- установим первую точку на 9 баров левее второй
time1=temp[0];
}
//--- если цена первой точки не задана, то сдвинем ее на 300 пунктов выше второй
if(!price1)
price1=price2+300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- если время третьей точки не задано, то оно совпадает с временем первой точки
if(!time3)
time3=time1;
//--- если цена третьей точки не задана, то она совпадает с ценой второй точки
if(!price3)
price3=price2;
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки канала
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования канала
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//--- создадим равноудаленный канал
if(!ChannelCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],InpColor,
InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки канала
//--- счетчик цикла
int h_steps=bars/6;
//--- перемещаем вторую точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d2<bars-1)
d2+=1;
//--- сдвигаем точку
if(!ChannelPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- перемещаем первую точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d1>1)
d1-=1;
//--- сдвигаем точку
if(!ChannelPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
int v_steps=accuracy/10;
//--- перемещаем третью точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p3>1)
p3-=1;
//--- сдвигаем точку
if(!ChannelPointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим канал с графика
ChannelDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_STDDEVCHANNEL

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_STDDEVCHANNEL

OBJ_STDDEVCHANNEL

Канал стандартного отклонения.

Примечание

Для канала стандартного отклонения можно указать режим продолжения его отображения вправо (свойство OBJPROP_RAY_RIGHT). Также можно установить режим заливки канала цветом.

Для изменения значения отклонения канала используется свойство OBJPROP_DEVIATION.

Пример

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

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Канал стандартного отклонения\"."
#property description "Координаты точек привязки задаются в процентах от размеров"
#property description "окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="StdDevChannel"; // Имя канала
input int InpDate1=10; // Дата 1-ой точки в %
input int InpDate2=40; // Дата 2-ой точки в %
input double InpDeviation=1.0; // Отклонение
input color InpColor=clrRed; // Цвет канала
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линий канала
input int InpWidth=1; // Толщина линий канала
input bool InpFill=false; // Заливка канала цветом
input bool InpBack=false; // Канал на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpRayRight=false; // Продолжение канала вправо
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает канал стандартного отклонения по заданным координатам |
//+------------------------------------------------------------------+
bool StdDevChannelCreate(const long chart_ID=0, // ID графика
const string name="Channel", // имя канала
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
datetime time2=0, // время второй точки
const double deviation=1.0, // отклонение
const color clr=clrRed, // цвет канала
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий канала
const int width=1, // толщина линий канала
const bool fill=false, // заливка канала цветом
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool ray_right=false, // продолжение канала вправо
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeChannelEmptyPoints(time1,time2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим канал по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_STDDEVCHANNEL,sub_window,time1,0,time2,0))
{
Print(__FUNCTION__,
": не удалось создать канал стандартного отклонения! Код ошибки = ",GetLastError());
return(false);
}
//--- установим величину отклонения, от нее зависит ширина канала
ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation);
//--- установим цвет канала
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линий канала
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий канала
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения канала для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- включим (true) или отключим (false) режим продолжения отображения канала вправо
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки канала |
//+------------------------------------------------------------------+
bool StdDevChannelPointChange(const long chart_ID=0, // ID графика
const string name="Channel", // имя канала
const int point_index=0, // номер точки привязки
datetime time=0) // координата времени точки привязки
{
//--- если время точки не задано, то перемещаем ее на текущий бар
if(!time)
time=TimeCurrent();
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,0))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет отклонение канала |
//+------------------------------------------------------------------+
bool StdDevChannelDeviationChange(const long chart_ID=0, // ID графика
const string name="Channel", // имя канала
const double deviation=1.0) // отклонение
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим угол наклона линии тренда
if(!ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation))
{
Print(__FUNCTION__,
": не удалось изменить отклонение канала! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет канал |
//+------------------------------------------------------------------+
bool StdDevChannelDelete(const long chart_ID=0, // ID графика
const string name="Channel") // имя канала
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим канал
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить канал! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки канала и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeChannelEmptyPoints(datetime &time1,datetime &time2)
{
//--- если время второй точки не задано, то она будет на текущем баре
if(!time2)
time2=TimeCurrent();
//--- если время первой точки не задано, то она лежит на 9 баров левее второй
if(!time1)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- установим вторую точку на 9 баров левее второй
time1=temp[0];
}
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки канала
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования канала
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
//--- создадим канал стандартного отклонения
if(!StdDevChannelCreate(0,InpName,0,date[d1],date[d2],InpDeviation,InpColor,InpStyle,
InpWidth,InpFill,InpBack,InpSelection,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать канал по горизонтали вправо и расширять его
//--- счетчик цикла
int h_steps=bars/2;
//--- перемещаем канал
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующие значения
if(d1<bars-1)
d1+=1;
if(d2<bars-1)
d2+=1;
//--- переместим точки привязки
if(!StdDevChannelPointChange(0,InpName,0,date[d1]))
return;
if(!StdDevChannelPointChange(0,InpName,1,date[d2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
double v_steps=InpDeviation*2;
//--- расширим канал
for(double i=InpDeviation;i<v_steps;i+=10.0/accuracy)
{
if(!StdDevChannelDeviationChange(0,InpName,i))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим канал с графика
StdDevChannelDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_REGRESSION

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_REGRESSION

OBJ_REGRESSION

Канал на линейной регрессии.

Примечание

Для канала на линейной регрессии можно указать режим продолжения его отображения вправо (свойство OBJPROP_RAY_RIGHT). Также можно установить режим заливки канала цветом.

Пример

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

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Канал на линейной регрессии\"."
#property description "Координаты точек привязки задаются в процентах от размеров"
#property description "окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Regression"; // Имя канала
input int InpDate1=10; // Дата 1-ой точки в %
input int InpDate2=40; // Дата 2-ой точки в %
input color InpColor=clrRed; // Цвет канала
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линий канала
input int InpWidth=1; // Толщина линий канала
input bool InpFill=false; // Заливка канала цветом
input bool InpBack=false; // Канал на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpRayRight=false; // Продолжение канала вправо
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает канал на линейной регрессии по заданным координатам |
//+------------------------------------------------------------------+
bool RegressionCreate(const long chart_ID=0, // ID графика
const string name="Regression", // имя канала
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
datetime time2=0, // время второй точки
const color clr=clrRed, // цвет канала
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий канала
const int width=1, // толщина линий канала
const bool fill=false, // заливка канала цветом
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool ray_right=false, // продолжение канала вправо
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeRegressionEmptyPoints(time1,time2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим канал по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_REGRESSION,sub_window,time1,0,time2,0))
{
Print(__FUNCTION__,
": не удалось создать канал на линейной регрессии! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет канала
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линий канала
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий канала
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения канала для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- включим (true) или отключим (false) режим продолжения отображения канала вправо
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки канала |
//+------------------------------------------------------------------+
bool RegressionPointChange(const long chart_ID=0, // ID графика
const string name="Channel", // имя канала
const int point_index=0, // номер точки привязки
datetime time=0) // координата времени точки привязки
{
//--- если время точки не задано, то перемещаем ее на текущий бар
if(!time)
time=TimeCurrent();
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,0))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет канал |
//+------------------------------------------------------------------+
bool RegressionDelete(const long chart_ID=0, // ID графика
const string name="Channel") // имя канала
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим канал
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить канал! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки канала и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeRegressionEmptyPoints(datetime &time1,datetime &time2)
{
//--- если время второй точки не задано, то она будет на текущем баре
if(!time2)
time2=TimeCurrent();
//--- если время первой точки не задано, то она лежит на 9 баров левее второй
if(!time1)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- установим первую точку на 9 баров левее второй
time1=temp[0];
}
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки канала
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования канала
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
//--- создадим канал на линейной регрессии
if(!RegressionCreate(0,InpName,0,date[d1],date[d2],InpColor,InpStyle,InpWidth,
InpFill,InpBack,InpSelection,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать канал по горизонтали вправо
//--- счетчик цикла
int h_steps=bars/2;
//--- перемещаем канал
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующие значения
if(d1<bars-1)
d1+=1;
if(d2<bars-1)
d2+=1;
//--- переместим точки привязки
if(!RegressionPointChange(0,InpName,0,date[d1]))
return;
if(!RegressionPointChange(0,InpName,1,date[d2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим канал с графика
RegressionDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_PITCHFORK

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_PITCHFORK

OBJ_PITCHFORK

Вилы Эндрюса.

Примечание

Для "Вил Эндрюса" можно указать режим продолжения отображения вправо (свойство OBJPROP_RAY_RIGHT).

Также можно указать количество линий-уровней, их значения и цвет.

Пример

Следующий скрипт создает и перемещает на графике "Вилы Эндрюса". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах.

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Вилы Эндрюса\"."
#property description "Координаты точек привязки задаются в процентах от"
#property description "размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Pitchfork"; // Имя вил
input int InpDate1=14; // Дата 1-ой точки в %
input int InpPrice1=40; // Цена 1-ой точки в %
input int InpDate2=18; // Дата 2-ой точки в %
input int InpPrice2=50; // Цена 2-ой точки в %
input int InpDate3=18; // Дата 3-ей точки в %
input int InpPrice3=30; // Цена 3-ей точки в %
input color InpColor=clrRed; // Цвет вил
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Стиль линий вил
input int InpWidth=1; // Толщина линий вил
input bool InpBack=false; // Вилы на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpRayRight=false; // Продолжение вил вправо
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает "Вилы Эндрюса" по заданным координатам |
//+------------------------------------------------------------------+
bool PitchforkCreate(const long chart_ID=0, // ID графика
const string name="Pitchfork", // имя вил
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
datetime time3=0, // время третьей точки
double price3=0, // цена третьей точки
const color clr=clrRed, // цвет линий вил
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий вил
const int width=1, // толщина линий вил
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool ray_right=false, // продолжение вил вправо
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeChannelEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим "Вилы Эндрюса" по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_PITCHFORK,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": не удалось создать \"Вилы Эндрюса\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линий
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения вил для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- включим (true) или отключим (false) режим продолжения отображения вил вправо
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки "Вил Эндрюса" |
//+------------------------------------------------------------------+
bool PitchforkPointChange(const long chart_ID=0, // ID графика
const string name="Pitchfork", // имя канала
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет "Вилы Эндрюса" |
//+------------------------------------------------------------------+
bool PitchforkDelete(const long chart_ID=0, // ID графика
const string name="Pitchfork") // имя канала
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим канал
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить \"Вилы Эндрюса\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки "Вил Эндрюса" и для пустых |
//| значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//--- если время второй (правой верхней) точки не задано, то она будет на текущем баре
if(!time2)
time2=TimeCurrent();
//--- если цена второй точки не задана, то она будет иметь значение Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время первой (левой) точки не задано, то она лежит на 9 баров левее второй
if(!time1)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- установим первую точку на 9 баров левее второй
time1=temp[0];
}
//--- если цена первой точки не задана, то сдвинем ее на 200 пунктов ниже второй
if(!price1)
price1=price2-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- если время третьей точки не задано, то оно совпадает с временем второй точки
if(!time3)
time3=time2;
//--- если цена третьей точки не задана, то сдвинем ее на 200 пунктов ниже первой
if(!price3)
price3=price1-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки "Вил Эндрюса"
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования "Вил Эндрюса"
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//--- создадим вилы
if(!PitchforkCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки вил
//--- счетчик цикла
int v_steps=accuracy/10;
//--- перемещаем первую точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p1>1)
p1-=1;
//--- сдвигаем точку
if(!PitchforkPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
int h_steps=bars/8;
//--- перемещаем третью точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d3<bars-1)
d3+=1;
//--- сдвигаем точку
if(!PitchforkPointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
v_steps=accuracy/10;
//--- перемещаем вторую точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p2>1)
p2-=1;
//--- сдвигаем точку
if(!PitchforkPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим вилы с графика
PitchforkDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_GANNLINE

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_GANNLINE

OBJ_GANNLINE

Линия Ганна.

Примечание

Для "Линии Ганна" можно указать режим продолжения ее отображения вправо (свойство OBJPROP_RAY_RIGHT).

Для установки наклона линии можно использовать как угол Ганна с масштабом, так и координаты второй точки привязки.

Пример

Следующий скрипт создает и перемещает на графике "Линию Ганна". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах.

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Линия Ганна\"."
#property description "Координаты точек привязки задаются в процентах от"
#property description "размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="GannLine"; // Имя линии
input int InpDate1=20; // Дата 1-ой точки в %
input int InpPrice1=75; // Цена 1-ой точки в %
input int InpDate2=80; // Дата 2-ой точки в %
input double InpAngle=0.0; // Угол Ганна
input double InpScale=1.0; // Масштаб
input color InpColor=clrRed; // Цвет линии
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линии
input int InpWidth=1; // Толщина линии
input bool InpBack=false; // Линия на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpRayRight=true; // Продолжение линии вправо
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает "Линию Ганна" по координатам, углу и масштабу |
//+------------------------------------------------------------------+
bool GannLineCreate(const long chart_ID=0, // ID графика
const string name="GannLine", // имя линии
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
const double angle=1.0, // угол Ганна
const double scale=1.0, // масштаб
const color clr=clrRed, // цвет линии
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
const int width=1, // толщина линии
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool ray_right=true, // продолжение линии вправо
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeGannLineEmptyPoints(time1,price1,time2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим "Линию Ганна" по заданным координатам
//--- правильная координата цены второй точки привязки переопределится
//--- автоматически после изменения угла Ганна и (или) масштаба,
if(!ObjectCreate(chart_ID,name,OBJ_GANNLINE,sub_window,time1,price1,time2,0))
{
Print(__FUNCTION__,
": не удалось создать \"Линию Ганна\"! Код ошибки = ",GetLastError());
return(false);
}
//--- изменим угол Ганна
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- изменим масштаб (количество пипсов на бар)
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//--- установим цвет линии
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения линии для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- включим (true) или отключим (false) режим продолжения отображения линии вправо
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки "Линии Ганна" |
//+------------------------------------------------------------------+
bool GannLinePointChange(const long chart_ID=0, // ID графика
const string name="GannLine", // имя линии
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки линии
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет угол Ганна |
//+------------------------------------------------------------------+
bool GannLineAngleChange(const long chart_ID=0, // ID графика
const string name="GannLine", // имя линии
const double angle=1.0) // угол Ганна
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим угол Ганна
if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle))
{
Print(__FUNCTION__,
": не удалось изменить угол Ганна! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет масштаб "Линии Ганна" |
//+------------------------------------------------------------------+
bool GannLineScaleChange(const long chart_ID=0, // ID графика
const string name="GannLine", // имя линии
const double scale=1.0) // масштаб
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим масштаб (количество пипсов на бар)
if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
{
Print(__FUNCTION__,
": не удалось изменить масштаб! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция удаляет "Линию Ганна" с графика |
//+------------------------------------------------------------------+
bool GannLineDelete(const long chart_ID=0, // ID графика
const string name="GannLine") // имя линии
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим линию Ганна
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить \"Линию Ганна\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки "Линии Ганна" и для пустых |
//| значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeGannLineEmptyPoints(datetime &time1,double &price1,datetime &time2)
{
//--- если время второй точки не задано, то она будет на текущем баре
if(!time2)
time2=TimeCurrent();
//--- если время первой точки не задано, то она лежит на 9 баров левее первой
if(!time1)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- установим первую точку на 9 баров левее второй
time1=temp[0];
}
//--- если цена первой точки не задана, то она будет иметь значение Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки линии
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования линии Ганна
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//--- создадим линию Ганна
if(!GannLineCreate(0,InpName,0,date[d1],price[p1],date[d2],InpAngle,InpScale,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точку привязки линии и менять угол
//--- счетчик цикла
int v_steps=accuracy/2;
//--- перемещаем первую точку привязки по вертикали
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p1>1)
p1-=1;
//--- сдвигаем точку
if(!GannLinePointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в полсекунды
Sleep(500);
//--- определим текущее значение угла Ганна (изменился
//--- после перемещения первой точки привязки)
double curr_angle;
if(!ObjectGetDouble(0,InpName,OBJPROP_ANGLE,0,curr_angle))
return;
//--- счетчик цикла
v_steps=accuracy/8;
//--- изменяем угол Ганна
for(int i=0;i<v_steps;i++)
{
if(!GannLineAngleChange(0,InpName,curr_angle-0.05*i))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим линию с графика
GannLineDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_GANNFAN

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_GANNFAN

OBJ_GANNFAN

Веер Ганна.

Примечание

Для "Веера Ганна" можно указать тип тренда из перечисления ENUM_GANN_DIRECTION. Регулируя значение масштаба (OBJPROP_SCALE), можно менять угол наклона линий веера.

Пример

Следующий скрипт создает и перемещает на графике "Веер Ганна". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах.

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Веер Ганна\"."
#property description "Координаты точек привязки задаются в процентах от"
#property description "размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="GannFan"; // Имя веера
input int InpDate1=15; // Дата 1-ой точки в %
input int InpPrice1=25; // Цена 1-ой точки в %
input int InpDate2=85; // Дата 2-ой точки в %
input double InpScale=2.0; // Масштаб
input bool InpDirection=false; // Направление тренда
input color InpColor=clrRed; // Цвет веера
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линий веера
input int InpWidth=1; // Толщина линий веера
input bool InpBack=false; // Веер на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает "Веер Ганна" |
//+------------------------------------------------------------------+
bool GannFanCreate(const long chart_ID=0, // ID графика
const string name="GannFan", // имя веера
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
const double scale=1.0, // масштаб
const bool direction=true, // направление тренда
const color clr=clrRed, // цвет веера
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий веера
const int width=1, // толщина линий веера
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeGannFanEmptyPoints(time1,price1,time2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим "Веер Ганна" по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_GANNFAN,sub_window,time1,price1,time2,0))
{
Print(__FUNCTION__,
": не удалось создать \"Веер Ганна\"! Код ошибки = ",GetLastError());
return(false);
}
//--- изменим масштаб (количество пипсов на бар)
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//--- изменим направление тренда "Веера Ганна" (true - нисходящий, false - восходящий)
ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction);
//--- установим цвет веера
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линий веера
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий веера
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения веера для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки "Веера Ганна" |
//+------------------------------------------------------------------+
bool GannFanPointChange(const long chart_ID=0, // ID графика
const string name="GannFan", // имя веера
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки веера
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет масштаб "Веера Ганна" |
//+------------------------------------------------------------------+
bool GannFanScaleChange(const long chart_ID=0, // ID графика
const string name="GannFan", // имя веера
const double scale=1.0) // масштаб
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим масштаб (количество пипсов на бар)
if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
{
Print(__FUNCTION__,
": не удалось изменить масштаб! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет направление тренда "Веера Ганна" |
//+------------------------------------------------------------------+
bool GannFanDirectionChange(const long chart_ID=0, // ID графика
const string name="GannFan", // имя веера
const bool direction=true) // направление тренда
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим направление тренда "Веера Ганна"
if(!ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction))
{
Print(__FUNCTION__,
": не удалось изменить направление тренда! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция удаляет "Веер Ганна" с графика |
//+------------------------------------------------------------------+
bool GannFanDelete(const long chart_ID=0, // ID графика
const string name="GannFan") // имя веера
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим веер Ганна
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить \"Веер Ганна\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки "Веера Ганна" и для пустых |
//| значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeGannFanEmptyPoints(datetime &time1,double &price1,datetime &time2)
{
//--- если время второй точки не задано, то она будет на текущем баре
if(!time2)
time2=TimeCurrent();
//--- если время первой точки не задано, то она лежит на 9 баров левее второй
if(!time1)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- установим первую точку на 9 баров левее второй
time1=temp[0];
}
//--- если цена первой точки не задана, то она будет иметь значение Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки веера
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования веера Ганна
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//--- создадим веер Ганна
if(!GannFanCreate(0,InpName,0,date[d1],price[p1],date[d2],InpScale,InpDirection,
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точку привязки веера
//--- счетчик цикла
int v_steps=accuracy/2;
//--- перемещаем первую точку привязки по вертикали
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p1<accuracy-1)
p1+=1;
//--- сдвигаем точку
if(!GannFanPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- изменим направление тренда веера на нисходящее
GannFanDirectionChange(0,InpName,true);
//--- перерисуем график
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим веер с графика
GannFanDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_GANNGRID

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_GANNGRID

OBJ_GANNGRID

Сетка Ганна.

Примечание

Для "Сетки Ганна" можно указать тип тренда из перечисления ENUM_GANN_DIRECTION. Регулируя значение масштаба (OBJPROP_SCALE), можно менять угол наклона линий сетки.

Пример

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

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Сетка Ганна\"."
#property description "Координаты точек привязки сетки задаются в процентах от"
#property description "размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="GannGrid"; // Имя сетки
input int InpDate1=15; // Дата 1-ой точки в %
input int InpPrice1=25; // Цена 1-ой точки в %
input int InpDate2=35; // Дата 2-ой точки в %
input double InpScale=3.0; // Масштаб
input bool InpDirection=false; // Направление тренда
input color InpColor=clrRed; // Цвет сетки
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линий сетки
input int InpWidth=1; // Толщина линий веера
input bool InpBack=false; // Сетка на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает "Сетку Ганна" |
//+------------------------------------------------------------------+
bool GannGridCreate(const long chart_ID=0, // ID графика
const string name="GannGrid", // имя сетки
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
const double scale=1.0, // масштаб
const bool direction=true, // направление тренда
const color clr=clrRed, // цвет сетки
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий сетки
const int width=1, // толщина линий сетки
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeGannGridEmptyPoints(time1,price1,time2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим "Сетка Ганна" по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_GANNGRID,sub_window,time1,price1,time2,0))
{
Print(__FUNCTION__,
": не удалось создать \"Сетку Ганна\"! Код ошибки = ",GetLastError());
return(false);
}
//--- изменим масштаб (количество пипсов на бар)
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//--- изменим направление тренда "Сетки Ганна" (true - нисходящий, false - восходящий)
ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction);
//--- установим цвет сетки
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линий сетки
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий сетки
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения сетки для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки "Сетки Ганна" |
//+------------------------------------------------------------------+
bool GannGridPointChange(const long chart_ID=0, // ID графика
const string name="GannGrid", // имя объекта "Сетка Ганна"
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки сетки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет масштаб "Сетки Ганна" |
//+------------------------------------------------------------------+
bool GannGridScaleChange(const long chart_ID=0, // ID графика
const string name="GannGrid", // имя сетки
const double scale=1.0) // масштаб
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим масштаб (количество пипсов на бар)
if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
{
Print(__FUNCTION__,
": не удалось изменить масштаб! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет направление тренда "Сетки Ганна" |
//+------------------------------------------------------------------+
bool GannGridDirectionChange(const long chart_ID=0, // ID графика
const string name="GannGrid", // имя сетки
const bool direction=true) // направление тренда
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим направление тренда "Сетки Ганна"
if(!ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction))
{
Print(__FUNCTION__,
": не удалось изменить направление тренда! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Функция удаляет "Сетку Ганна" с графика |
//+------------------------------------------------------------------+
bool GannGridDelete(const long chart_ID=0, // ID графика
const string name="GannGrid") // имя сетки
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим сетку Ганна
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить \"Сетку Ганна\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки "Сетки Ганна" и для пустых |
//| значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeGannGridEmptyPoints(datetime &time1,double &price1,datetime &time2)
{
//--- если время второй точки не задано, то она будет на текущем баре
if(!time2)
time2=TimeCurrent();
//--- если время первой точки не задано, то она лежит на 9 баров левее первой
if(!time1)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- установим первую точку на 9 баров левее второй
time1=temp[0];
}
//--- если цена первой точки не задана, то она будет иметь значение Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки сетки
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования сетки Ганна
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//--- создадим сетку Ганна
if(!GannGridCreate(0,InpName,0,date[d1],price[p1],date[d2],InpScale,InpDirection,
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки сетки
//--- счетчик цикла
int v_steps=accuracy/4;
//--- перемещаем первую точку привязки по вертикали
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p1<accuracy-1)
p1+=1;
if(!GannGridPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
int h_steps=bars/4;
//--- перемещаем вторую точку привязки по горизонтали
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d2<bars-1)
d2+=1;
if(!GannGridPointChange(0,InpName,1,date[d2],0))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- изменим направление тренда сетки на нисходящее
GannGridDirectionChange(0,InpName,true);
//--- перерисуем график
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим сетку с графика
GannGridDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_FIBO

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_FIBO

OBJ_FIBO

Уровни Фибоначчи.

Примечание

Для "Уровней Фибоначчи" можно указать режим продолжения отображения вправо (свойство OBJPROP_RAY_RIGHT).

Также можно указать количество линий-уровней, их значения и цвет.

Пример

Следующий скрипт создает и перемещает на графике "Уровни Фибоначчи". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах.

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Уровни Фибоначчи\"."
#property description "Координаты точек привязки задаются в процентах от"
#property description "размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="FiboLevels"; // Имя объекта
input int InpDate1=10; // Дата 1-ой точки в %
input int InpPrice1=65; // Цена 1-ой точки в %
input int InpDate2=90; // Дата 2-ой точки в %
input int InpPrice2=85; // Цена 2-ой точки в %
input color InpColor=clrRed; // Цвет объекта
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линии
input int InpWidth=1; // Толщина линии
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpRayRight=false; // Продолжение объекта вправо
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Cоздает "Уровни Фибоначчи" по заданным координатам |
//+------------------------------------------------------------------+
bool FiboLevelsCreate(const long chart_ID=0, // ID графика
const string name="FiboLevels", // имя объекта
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
const color clr=clrRed, // цвет объекта
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии объекта
const int width=1, // толщина линии объекта
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool ray_right=false, // продолжение объекта вправо
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeFiboLevelsEmptyPoints(time1,price1,time2,price2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим "Уровни Фибоначчи" по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_FIBO,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": не удалось создать \"Уровни Фибоначчи\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения объекта для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- включим (true) или отключим (false) режим продолжения отображения объекта вправо
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установи приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Задает количество уровней и их параметры |
//+------------------------------------------------------------------+
bool FiboLevelsSet(int levels, // количество линий уровня
double &values[], // значения линий уровня
color &colors[], // цвет линий уровня
ENUM_LINE_STYLE &styles[], // стиль линий уровня
int &widths[], // толщина линий уровня
const long chart_ID=0, // ID графика
const string name="FiboLevels") // имя объекта
{
//--- проверим размеры массивов
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": длина массива не соответствует количеству уровней, ошибка!");
return(false);
}
//--- установим количество уровней
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- установим свойства уровней в цикле
for(int i=0;i<levels;i++)
{
//--- значение уровня
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- цвет уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- стиль уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- толщина уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- описание уровня
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки "Уровней Фибоначчи" |
//+------------------------------------------------------------------+
bool FiboLevelsPointChange(const long chart_ID=0, // ID графика
const string name="FiboLevels", // имя объекта
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет "Уровни Фибоначчи" |
//+------------------------------------------------------------------+
bool FiboLevelsDelete(const long chart_ID=0, // ID графика
const string name="FiboLevels") // имя объекта
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим объект
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить \"Уровни Фибоначчи\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки "Уровней Фибоначчи" и для |
//| пустых значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeFiboLevelsEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- если время второй точки не задано, то она будет на текущем баре
if(!time2)
time2=TimeCurrent();
//--- если цена второй точки не задана, то она будет иметь значение Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время первой точки не задано, то она лежит на 9 баров левее второй
if(!time1)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- установим первую точку на 9 баров левее второй
time1=temp[0];
}
//--- если цена первой точки не задана, то сдвинем ее на 200 пунктов ниже второй
if(!price1)
price1=price2-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки "Уровней Фибоначчи"
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования "Уровней Фибоначчи"
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- создадим объект
if(!FiboLevelsCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки
//--- счетчик цикла
int v_steps=accuracy*2/5;
//--- перемещаем первую точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p1>1)
p1-=1;
//--- сдвигаем точку
if(!FiboLevelsPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
v_steps=accuracy*4/5;
//--- перемещаем вторую точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p2>1)
p2-=1;
//--- сдвигаем точку
if(!FiboLevelsPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим объект с графика
FiboLevelsDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_FIBOTIMES

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_FIBOTIMES

OBJ_FIBOTIMES

Временные зоны Фибоначчи.

Примечание

Для "Временных зон Фибоначчи" можно указать количество линий-уровней, их значения и цвет.

Пример

Следующий скрипт создает и перемещает на графике "Временные зоны Фибоначчи". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах.

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Временные зоны Фибоначчи\"."
#property description "Координаты точек привязки задаются в процентах от размеров"
#property description "окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="FiboTimes"; // Имя объекта
input int InpDate1=10; // Дата 1-ой точки в %
input int InpPrice1=45; // Цена 1-ой точки в %
input int InpDate2=20; // Дата 2-ой точки в %
input int InpPrice2=55; // Цена 2-ой точки в %
input color InpColor=clrRed; // Цвет объекта
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линии
input int InpWidth=1; // Толщина линии
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Cоздает "Временные зоны Фибоначчи" по заданным координатам |
//+------------------------------------------------------------------+
bool FiboTimesCreate(const long chart_ID=0, // ID графика
const string name="FiboTimes", // имя объекта
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
const color clr=clrRed, // цвет объекта
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии объекта
const int width=1, // толщина линии объекта
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeFiboTimesEmptyPoints(time1,price1,time2,price2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим "Временные зоны Фибоначчи" по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_FIBOTIMES,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": не удалось создать \"Временные зоны Фибоначчи\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения объекта для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Задает количество уровней и их параметры |
//+------------------------------------------------------------------+
bool FiboTimesLevelsSet(int levels, // количество линий уровня
double &values[], // значения линий уровня
color &colors[], // цвет линий уровня
ENUM_LINE_STYLE &styles[], // стиль линий уровня
int &widths[], // толщина линий уровня
const long chart_ID=0, // ID графика
const string name="FiboTimes") // имя объекта
{
//--- проверим размеры массивов
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": длина массива не соответствует количеству уровней, ошибка!");
return(false);
}
//--- установим количество уровней
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- установим свойства уровней в цикле
for(int i=0;i<levels;i++)
{
//--- значение уровня
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- цвет уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- стиль уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- толщина уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- описание уровня
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(values[i],1));
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки "Временных зон Фибоначчи" |
//+------------------------------------------------------------------+
bool FiboTimesPointChange(const long chart_ID=0, // ID графика
const string name="FiboTimes", // имя объекта
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет "Временные зоны Фибоначчи" |
//+------------------------------------------------------------------+
bool FiboTimesDelete(const long chart_ID=0, // ID графика
const string name="FiboTimes") // имя объекта
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим объект
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить \"Временные зоны Фибоначчи\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки "Временных зон Фибоначчи" и |
//| для пустых значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeFiboTimesEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- если время первой точки не задано, то она будет на текущем баре
if(!time1)
time1=TimeCurrent();
//--- если цена первой точки не задана, то она будет иметь значение Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время второй точки не задано, то она лежит на 2 бара левее второй
if(!time2)
{
//--- массив для приема времени открытия 3 последних баров
datetime temp[3];
CopyTime(Symbol(),Period(),time1,3,temp);
//--- установим первую точку на 2 бара левее второй
time2=temp[0];
}
//--- если цена второй точки не задана, то она совпадает с ценой первой точки
if(!price2)
price2=price1;
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки "Временных зон Фибоначчи"
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования "Временных зон Фибоначчи"
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- создадим объект
if(!FiboTimesCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки
//--- счетчик цикла
int h_steps=bars*2/5;
//--- перемещаем вторую точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d2<bars-1)
d2+=1;
//--- сдвигаем точку
if(!FiboTimesPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
h_steps=bars*3/5;
//--- перемещаем первую точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d1<bars-1)
d1+=1;
//--- сдвигаем точку
if(!FiboTimesPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим объект с графика
FiboTimesDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_FIBOFAN

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_FIBOFAN

OBJ_FIBOFAN

Веер Фибоначчи.

Примечание

Для "Веера Фибоначчи" можно указать количество линий-уровней, их значения и цвет.

Пример

Следующий скрипт создает и перемещает на графике "Веер Фибоначчи". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах.

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Веер Фибоначчи\"."
#property description "Координаты точек привязки задаются в процентах от"
#property description "размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="FiboFan"; // Имя веера
input int InpDate1=10; // Дата 1-ой точки в %
input int InpPrice1=25; // Цена 1-ой точки в %
input int InpDate2=30; // Дата 2-ой точки в %
input int InpPrice2=50; // Цена 2-ой точки в %
input color InpColor=clrRed; // Цвет линии веера
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линии
input int InpWidth=1; // Толщина линии
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Cоздает "Веер Фибоначчи" по заданным координатам |
//+------------------------------------------------------------------+
bool FiboFanCreate(const long chart_ID=0, // ID графика
const string name="FiboFan", // имя веера
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
const color clr=clrRed, // цвет линии веера
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии веера
const int width=1, // толщина линии веера
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeFiboFanEmptyPoints(time1,price1,time2,price2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим "Веер Фибоначчи" по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_FIBOFAN,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": не удалось создать \"Веер Фибоначчи\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения веера для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Задает количество уровней и их параметры |
//+------------------------------------------------------------------+
bool FiboFanLevelsSet(int levels, // количество линий уровня
double &values[], // значения линий уровня
color &colors[], // цвет линий уровня
ENUM_LINE_STYLE &styles[], // стиль линий уровня
int &widths[], // толщина линий уровня
const long chart_ID=0, // ID графика
const string name="FiboFan") // имя веера
{
//--- проверим размеры массивов
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": длина массива не соответствует количеству уровней, ошибка!");
return(false);
}
//--- установим количество уровней
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- установим свойства уровней в цикле
for(int i=0;i<levels;i++)
{
//--- значение уровня
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- цвет уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- стиль уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- толщина уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- описание уровня
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки "Веера Фибоначчи" |
//+------------------------------------------------------------------+
bool FiboFanPointChange(const long chart_ID=0, // ID графика
const string name="FiboFan", // имя веера
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет "Веер Фибоначчи" |
//+------------------------------------------------------------------+
bool FiboFanDelete(const long chart_ID=0, // ID графика
const string name="FiboFan") // имя веера
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим веер
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить \"Веер Фибоначчи\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки "Веера Фибоначчи" и для |
//| пустых значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeFiboFanEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- если время второй точки не задано, то она будет на текущем баре
if(!time2)
time2=TimeCurrent();
//--- если цена второй точки не задана, то она будет иметь значение Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время первой точки не задано, то она лежит на 9 баров левее второй
if(!time1)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- установим первую точку на 9 баров левее второй
time1=temp[0];
}
//--- если цена первой точки не задана, то сдвинем ее на 200 пунктов ниже второй
if(!price1)
price1=price2-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки "Веера Фибоначчи"
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования "Веера Фибоначчи"
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- создадим объект
if(!FiboFanCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки веера
//--- счетчик цикла
int v_steps=accuracy/2;
//--- перемещаем первую точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p1<accuracy-1)
p1+=1;
//--- сдвигаем точку
if(!FiboFanPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
int h_steps=bars/4;
//--- перемещаем вторую точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d2<bars-1)
d2+=1;
//--- сдвигаем точку
if(!FiboFanPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим объект с графика
FiboFanDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_FIBOARC

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_FIBOARC

OBJ_FIBOARC

Дуги Фибоначчи.

Примечание

Для "Дуг Фибоначчи" можно указать режим отображения всего эллипса целиком. Радиус кривизны линий можно задать изменяя масштаб и координаты точек привязки.

Также можно указать количество линий-уровней, их значения и цвет.

Пример

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

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Дуги Фибоначчи\"."
#property description "Координаты точек привязки задаются в процентах от"
#property description "размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="FiboArc"; // Имя объекта
input int InpDate1=25; // Дата 1-ой точки в %
input int InpPrice1=25; // Цена 1-ой точки в %
input int InpDate2=35; // Дата 2-ой точки в %
input int InpPrice2=55; // Цена 2-ой точки в %
input double InpScale=3.0; // Масштаб
input bool InpFullEllipse=true; // Форма дуг
input color InpColor=clrRed; // Цвет линии
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линии
input int InpWidth=1; // Толщина линии
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Cоздает "Дуги Фибоначчи" по заданным координатам |
//+------------------------------------------------------------------+
bool FiboArcCreate(const long chart_ID=0, // ID графика
const string name="FiboArc", // имя объекта
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
const double scale=1.0, // масштаб
const bool full_ellipse=false, // форма дуг
const color clr=clrRed, // цвет линии
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
const int width=1, // толщина линии
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeFiboArcEmptyPoints(time1,price1,time2,price2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим "Дуги Фибоначчи" по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_FIBOARC,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": не удалось создать \"Дуги Фибоначчи\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим масштаб
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//--- установим отображение дуг в виде полного эллипса (true) или половины (false)
ObjectSetInteger(chart_ID,name,OBJPROP_ELLIPSE,full_ellipse);
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения дуг для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Задает количество уровней и их параметры |
//+------------------------------------------------------------------+
bool FiboArcLevelsSet(int levels, // количество линий уровня
double &values[], // значения линий уровня
color &colors[], // цвет линий уровня
ENUM_LINE_STYLE &styles[], // стиль линий уровня
int &widths[], // толщина линий уровня
const long chart_ID=0, // ID графика
const string name="FiboArc") // имя объекта
{
//--- проверим размеры массивов
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": длина массива не соответствует количеству уровней, ошибка!");
return(false);
}
//--- установим количество уровней
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- установим свойства уровней в цикле
for(int i=0;i<levels;i++)
{
//--- значение уровня
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- цвет уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- стиль уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- толщина уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- описание уровня
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки "Дуг Фибоначчи" |
//+------------------------------------------------------------------+
bool FiboArcPointChange(const long chart_ID=0, // ID графика
const string name="FiboArc", // имя объекта
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет "Дуги Фибоначчи" |
//+------------------------------------------------------------------+
bool FiboArcDelete(const long chart_ID=0, // ID графика
const string name="FiboArc") // имя объекта
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим объект
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить \"Дуги Фибоначчи\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки "Дуг Фибоначчи" и для пустых |
//| значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeFiboArcEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- если время второй точки не задано, то она будет на текущем баре
if(!time2)
time2=TimeCurrent();
//--- если цена второй точки не задана, то она будет иметь значение Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время первой точки не задано, то она лежит на 9 баров левее второй
if(!time1)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- установим первую точку на 9 баров левее второй
time1=temp[0];
}
//--- если цена первой точки не задана, то сдвинем ее на 300 пунктов ниже второй
if(!price1)
price1=price2-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки "Дуг Фибоначчи"
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования "Дуг Фибоначчи"
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- создадим объект
if(!FiboArcCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpScale,
InpFullEllipse,InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки
//--- счетчик цикла
int v_steps=accuracy/5;
//--- перемещаем первую точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p1<accuracy-1)
p1+=1;
//--- сдвигаем точку
if(!FiboArcPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
int h_steps=bars/5;
//--- перемещаем вторую точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d2<bars-1)
d2+=1;
//--- сдвигаем точку
if(!FiboArcPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим объект с графика
FiboArcDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_FIBOCHANNEL

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_FIBOCHANNEL

OBJ_FIBOCHANNEL

Канал Фибоначчи.

Примечание

Для "Канала Фибоначчи" можно указать режим продолжения его отображения на весь график (свойство OBJPROP_RAY).

Также можно указать количество линий-уровней, их значения и цвет.

Пример

Следующий скрипт создает и перемещает на графике "Канал Фибоначчи". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах.

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Канал Фибоначчи\"."
#property description "Координаты точек привязки задаются в процентах от"
#property description "размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="FiboChannel"; // Имя канала
input int InpDate1=20; // Дата 1-ой точки в %
input int InpPrice1=10; // Цена 1-ой точки в %
input int InpDate2=60; // Дата 2-ой точки в %
input int InpPrice2=30; // Цена 2-ой точки в %
input int InpDate3=20; // Дата 3-ей точки в %
input int InpPrice3=25; // Цена 3-ей точки в %
input color InpColor=clrRed; // Цвет канала
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линий канала
input int InpWidth=1; // Толщина линий канала
input bool InpBack=false; // Канал на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpRay=false; // Продолжение канала на весь график
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Cоздает "Канал Фибоначчи" по заданным координатам |
//+------------------------------------------------------------------+
bool FiboChannelCreate(const long chart_ID=0, // ID графика
const string name="FiboChannel", // имя канала
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
datetime time3=0, // время третьей точки
double price3=0, // цена третьей точки
const color clr=clrRed, // цвет канала
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий канала
const int width=1, // толщина линий канала
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool ray=false, // продолжение канала на весь график
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeFiboChannelEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим канал по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_FIBOCHANNEL,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": не удалось создать \"Канал Фибоначчи\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет канала
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линий канала
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий канала
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения канала для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- включим (true) или отключим (false) режим продолжения отображения канала на весь график
ObjectSetInteger(chart_ID,name,OBJPROP_RAY,ray);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Задает количество уровней и их параметры |
//+------------------------------------------------------------------+
bool FiboChannelLevelsSet(int levels, // количество линий уровня
double &values[], // значения линий уровня
color &colors[], // цвет линий уровня
ENUM_LINE_STYLE &styles[], // стиль линий уровня
int &widths[], // толщина линий уровня
const long chart_ID=0, // ID графика
const string name="FiboChannel") // имя объекта
{
//--- проверим размеры массивов
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": длина массива не соответствует количеству уровней, ошибка!");
return(false);
}
//--- установим количество уровней
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- установим свойства уровней в цикле
for(int i=0;i<levels;i++)
{
//--- значение уровня
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- цвет уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- стиль уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- толщина уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- описание уровня
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки "Канала Фибоначчи" |
//+------------------------------------------------------------------+
bool FiboChannelPointChange(const long chart_ID=0, // ID графика
const string name="FiboChannel", // имя канала
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет канал |
//+------------------------------------------------------------------+
bool FiboChannelDelete(const long chart_ID=0, // ID графика
const string name="FiboChannel") // имя канала
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим канал
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить \"Канал Фибоначчи\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки "Канала Фибоначчи" и для |
//| пустых значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeFiboChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//--- если время второй (правой) точки не задано, то она будет на текущем баре
if(!time2)
time2=TimeCurrent();
//--- если цена второй точки не задана, то она будет иметь значение Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время первой (левой) точки не задано, то она лежит на 9 баров левее второй
if(!time1)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- установим первую точку на 9 баров левее второй
time1=temp[0];
}
//--- если цена первой точки не задана, то сдвинем ее на 300 пунктов выше второй
if(!price1)
price1=price2+300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- если время третьей точки не задано, то оно совпадает с временем первой точки
if(!time3)
time3=time1;
//--- если цена третьей точки не задана, то она совпадает с ценой второй точки
if(!price3)
price3=price2;
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки канала
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования канала
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//--- создадим "Канал Фибоначчи"
if(!FiboChannelCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRay,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки канала
//--- счетчик цикла
int h_steps=bars/10;
//--- перемещаем первую точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d1>1)
d1-=1;
//--- сдвигаем точку
if(!FiboChannelPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
int v_steps=accuracy/10;
//--- перемещаем вторую точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p2>1)
p2-=1;
//--- сдвигаем точку
if(!FiboChannelPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
v_steps=accuracy/15;
//--- перемещаем третью точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p3<accuracy-1)
p3+=1;
//--- сдвигаем точку
if(!FiboChannelPointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим канал с графика
FiboChannelDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_EXPANSION

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_EXPANSION

OBJ_EXPANSION

Расширение Фибоначчи.

Примечание

Для "Расширения Фибоначчи" можно указать режим продолжения отображения вправо (свойство OBJPROP_RAY_RIGHT).

Также можно указать количество линий-уровней, их значения и цвет.

Пример

Следующий скрипт создает и перемещает на графике "Расширение Фибоначчи". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах.

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Расширение Фибоначчи\"."
#property description "Координаты точек привязки задаются в процентах от"
#property description "размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="FiboExpansion"; // Имя объекта
input int InpDate1=10; // Дата 1-ой точки в %
input int InpPrice1=55; // Цена 1-ой точки в %
input int InpDate2=30; // Дата 2-ой точки в %
input int InpPrice2=10; // Цена 2-ой точки в %
input int InpDate3=80; // Дата 3-ей точки в %
input int InpPrice3=75; // Цена 3-ей точки в %
input color InpColor=clrRed; // Цвет объекта
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линий
input int InpWidth=1; // Толщина линий
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpRayRight=false; // Продолжение объекта вправо
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Cоздает "Расширение Фибоначчи" по заданным координатам |
//+------------------------------------------------------------------+
bool FiboExpansionCreate(const long chart_ID=0, // ID графика
const string name="FiboExpansion", // имя канала
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
datetime time3=0, // время третьей точки
double price3=0, // цена третьей точки
const color clr=clrRed, // цвет объекта
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий
const int width=1, // толщина линий
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool ray_right=false, // продолжение объекта вправо
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeFiboExpansionEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим "Расширение Фибоначчи" по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_EXPANSION,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": не удалось создать \"Расширение Фибоначчи\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет объекта
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линий
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения объекта для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- включим (true) или отключим (false) режим продолжения отображения объекта вправо
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Задает количество уровней и их параметры |
//+------------------------------------------------------------------+
bool FiboExpansionLevelsSet(int levels, // количество линий уровня
double &values[], // значения линий уровня
color &colors[], // цвет линий уровня
ENUM_LINE_STYLE &styles[], // стиль линий уровня
int &widths[], // толщина линий уровня
const long chart_ID=0, // ID графика
const string name="FiboExpansion") // имя объекта
{
//--- проверим размеры массивов
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": длина массива не соответствует количеству уровней, ошибка!");
return(false);
}
//--- установим количество уровней
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- установим свойства уровней в цикле
for(int i=0;i<levels;i++)
{
//--- значение уровня
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- цвет уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- стиль уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- толщина уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- описание уровня
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,"FE "+DoubleToString(100*values[i],1));
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки "Расширения Фибоначчи" |
//+------------------------------------------------------------------+
bool FiboExpansionPointChange(const long chart_ID=0, // ID графика
const string name="FiboExpansion", // имя объекта
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет "Расширение Фибоначчи" |
//+------------------------------------------------------------------+
bool FiboExpansionDelete(const long chart_ID=0, // ID графика
const string name="FiboExpansion") // имя объекта
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим объект
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить \"Расширение Фибоначчи\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки "Расширения Фибоначчи" и для |
//| пустых значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeFiboExpansionEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//--- если время третьей (правой) точки не задано, то она будет на текущем баре
if(!time3)
time3=TimeCurrent();
//--- если цена третьей точки не задана, то она будет иметь значение Bid
if(!price3)
price3=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время первой (левой) точки не задано, то она лежит на 9 баров левее третьей
//--- массив для приема времени открытия 10 последних баров
datetime temp[];
ArrayResize(temp,10);
if(!time1)
{
CopyTime(Symbol(),Period(),time3,10,temp);
//--- установим первую точку на 9 баров левее второй
time1=temp[0];
}
//--- если цена первой точки не задана, то она совпадает с ценой третьей точки
if(!price1)
price1=price3;
//--- если время второй точки не задано, то она лежит на 7 баров левее третьей
if(!time2)
time2=temp[2];
//--- если цена второй точки не задана, сдвинем ее на 250 пунктов ниже первой
if(!price2)
price2=price1-250*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки объекта
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования "Расширения Фибоначчи"
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//--- создадим "Расширение Фибоначчи"
if(!FiboExpansionCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки
//--- счетчик цикла
int v_steps=accuracy/10;
//--- перемещаем первую точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p1>1)
p1-=1;
//--- сдвигаем точку
if(!FiboExpansionPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
v_steps=accuracy/2;
//--- перемещаем третью точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p3>1)
p3-=1;
//--- сдвигаем точку
if(!FiboExpansionPointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
v_steps=accuracy*4/5;
//--- перемещаем вторую точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p2<accuracy-1)
p2+=1;
//--- сдвигаем точку
if(!FiboExpansionPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим объект с графика
FiboExpansionDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_RECTANGLE

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_RECTANGLE

OBJ_RECTANGLE

Прямоугольник.

Пример

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

#property strict
//--- описание
#property description "Скрипт строит прямоугольник на графике."
#property description "Координаты точек привязки задаются в"
#property description "процентах от размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Rectangle"; // Имя прямоугольника
input int InpDate1=40; // Дата 1-ой точки в %
input int InpPrice1=40; // Цена 1-ой точки в %
input int InpDate2=60; // Дата 2-ой точки в %
input int InpPrice2=60; // Цена 2-ой точки в %
input color InpColor=clrRed; // Цвет прямоугольника
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линий прямоугольника
input int InpWidth=1; // Толщина линий прямоугольника
input bool InpFill=true; // Заливка прямоугольника цветом
input bool InpBack=false; // Прямоугольника на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Cоздает прямоугольник по заданным координатам |
//+------------------------------------------------------------------+
bool RectangleCreate(const long chart_ID=0, // ID графика
const string name="Rectangle", // имя прямоугольника
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
const color clr=clrRed, // цвет прямоугольника
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий прямоугольника
const int width=1, // толщина линий прямоугольника
const bool fill=false, // заливка прямоугольника цветом
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeRectangleEmptyPoints(time1,price1,time2,price2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим прямоугольник по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": не удалось создать прямоугольник! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет прямоугольника
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линий прямоугольника
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий прямоугольника
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- включим (true) или отключим (false) режим заливки прямоугольника
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения прямоугольника для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки прямоугольника |
//+------------------------------------------------------------------+
bool RectanglePointChange(const long chart_ID=0, // ID графика
const string name="Rectangle", // имя прямоугольника
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет прямоугольник |
//+------------------------------------------------------------------+
bool RectangleDelete(const long chart_ID=0, // ID графика
const string name="Rectangle") // имя прямоугольника
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим прямоугольник
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить прямоугольник! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки прямоугольника и для пустых |
//| значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeRectangleEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- если время первой точки не задано, то она будет на текущем баре
if(!time1)
time1=TimeCurrent();
//--- если цена первой точки не задана, то она будет иметь значение Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время второй точки не задано, то она лежит на 9 баров левее второй
if(!time2)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- установим вторую точку на 9 баров левее первой
time2=temp[0];
}
//--- если цена второй точки не задана, сдвинем ее на 300 пунктов ниже первой
if(!price2)
price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки прямоугольника
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования прямоугольника
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- создадим прямоугольник
if(!RectangleCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки прямоугольника
//--- счетчик цикла
int h_steps=bars/2;
//--- перемещаем точки привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующие значения
if(d1<bars-1)
d1+=1;
if(d2>1)
d2-=1;
//--- сдвигаем точки
if(!RectanglePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!RectanglePointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
int v_steps=accuracy/2;
//--- перемещаем точки привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующие значения
if(p1<accuracy-1)
p1+=1;
if(p2>1)
p2-=1;
//--- сдвигаем точки
if(!RectanglePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!RectanglePointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим прямоугольник с графика
RectangleDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_TRIANGLE

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_TRIANGLE

OBJ_TRIANGLE

Треугольник.

Пример

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

#property strict
//--- описание
#property description "Скрипт строит треугольник на графике."
#property description "Координаты точек привязки задаются в"
#property description "процентах от размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Triangle"; // Имя треугольника
input int InpDate1=25; // Дата 1-ой точки в %
input int InpPrice1=50; // Цена 1-ой точки в %
input int InpDate2=70; // Дата 2-ой точки в %
input int InpPrice2=70; // Цена 2-ой точки в %
input int InpDate3=65; // Дата 3-ей точки в %
input int InpPrice3=20; // Цена 3-ей точки в %
input color InpColor=clrRed; // Цвет треугольника
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линий треугольника
input int InpWidth=1; // Толщина линий треугольника
input bool InpFill=false; // Заливка треугольника цветом
input bool InpBack=false; // Треугольника на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Cоздает треугольник по заданным координатам |
//+------------------------------------------------------------------+
bool TriangleCreate(const long chart_ID=0, // ID графика
const string name="Triangle", // имя треугольника
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
datetime time3=0, // время третьей точки
double price3=0, // цена третьей точки
const color clr=clrRed, // цвет треугольника
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий треугольника
const int width=1, // толщина линий треугольника
const bool fill=false, // заливка треугольника цветом
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeTriangleEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим треугольник по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_TRIANGLE,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": не удалось создать треугольник! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет треугольника
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линий треугольника
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий треугольника
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения треугольник для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки треугольника |
//+------------------------------------------------------------------+
bool TrianglePointChange(const long chart_ID=0, // ID графика
const string name="Triangle", // имя треугольника
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет треугольник |
//+------------------------------------------------------------------+
bool TriangleDelete(const long chart_ID=0, // ID графика
const string name="Triangle") // имя треугольника
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим треугольник
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить треугольник! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки треугольника и для пустых |
//| значений устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeTriangleEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2,
datetime &time3,double &price3)
{
//--- если время первой точки не задано, то она будет на текущем баре
if(!time1)
time1=TimeCurrent();
//--- если цена первой точки не задана, то она будет иметь значение Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время второй точки не задано, то она лежит на 9 баров левее второй
if(!time2)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- установим вторую точку на 9 баров левее первой
time2=temp[0];
}
//--- если цена второй точки не задана, сдвинем ее на 300 пунктов ниже первой
if(!price2)
price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- если время третьей точки не задано, то оно будет совпадать с датой второй точки
if(!time3)
time3=time2;
//--- если цена первой точки не задана, то она будет совпадать с ценой первой точки
if(!price3)
price3=price1;
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки треугольника
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования треугольника
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//--- создадим треугольник
if(!TriangleCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpColor,InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки треугольника
//--- счетчик цикла
int v_steps=accuracy*3/10;
//--- перемещаем первую точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p1>1)
p1-=1;
//--- сдвигаем точку
if(!TrianglePointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
int h_steps=bars*9/20-1;
//--- перемещаем вторую точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d2>1)
d2-=1;
//--- сдвигаем точку
if(!TrianglePointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
v_steps=accuracy/4;
//--- перемещаем третью точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p3<accuracy-1)
p3+=1;
//--- сдвигаем точку
if(!TrianglePointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим треугольник с графика
TriangleDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_ELLIPSE

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ELLIPSE

OBJ_ELLIPSE

Эллипс.

Пример

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

#property strict
//--- описание
#property description "Скрипт строит эллипс на графике."
#property description "Координаты точек привязки задаются"
#property description "в процентах от размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Ellipse"; // Имя эллипса
input int InpDate1=30; // Дата 1-ой точки в %
input int InpPrice1=20; // Цена 1-ой точки в %
input int InpDate2=70; // Дата 2-ой точки в %
input int InpPrice2=80; // Цена 2-ой точки в %
input double InpEllipseScale=0.2; // Соотношение между временной и ценовой шкалами
input color InpColor=clrRed; // Цвет эллипса
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линий эллипса
input int InpWidth=1; // Толщина линий эллипса
input bool InpFill=false; // Заливка эллипса цветом
input bool InpBack=false; // Эллипс на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Cоздает эллипс по заданным координатам |
//+------------------------------------------------------------------+
bool EllipseCreate(const long chart_ID=0, // ID графика
const string name="Ellipse", // имя эллипса
const int sub_window=0, // номер подокна
datetime time1=0, // время первой точки
double price1=0, // цена первой точки
datetime time2=0, // время второй точки
double price2=0, // цена второй точки
double ellipse_scale=0, // соотношение между временной и ценовой шкалами
const color clr=clrRed, // цвет эллипса
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий эллипса
const int width=1, // толщина линий эллипса
const bool fill=false, // заливка эллипса цветом
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы
ChangeEllipseEmptyPoints(time1,price1,time2,price2);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим эллипс по заданным координатам
if(!ObjectCreate(chart_ID,name,OBJ_ELLIPSE,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": не удалось создать эллипс! Код ошибки = ",GetLastError());
return(false);
}
//--- установим соотношение между временной и ценовой шкалами
ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,InpEllipseScale);
//--- установим цвет эллипса
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линий эллипса
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий эллипса
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения эллипса для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки эллипса |
//+------------------------------------------------------------------+
bool EllipsePointChange(const long chart_ID=0, // ID графика
const string name="Ellipse", // имя эллипса
const int point_index=0, // номер точки привязки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет эллипс |
//+------------------------------------------------------------------+
bool EllipseDelete(const long chart_ID=0, // ID графика
const string name="Ellipse") // имя эллипса
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим эллипс
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить эллипс! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точек привязки эллипса и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeEllipseEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- если время первой точки не задано, то она будет на текущем баре
if(!time1)
time1=TimeCurrent();
//--- если цена первой точки не задана, то она будет иметь значение Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- если время второй точки не задано, то она лежит на 9 баров левее второй
if(!time2)
{
//--- массив для приема времени открытия 10 последних баров
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- установим вторую точку на 9 баров левее первой
time2=temp[0];
}
//--- если цена второй точки не задана, сдвинем ее на 300 пунктов ниже первой
if(!price2)
price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки эллипса
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- установить порядок данных как в таймсерии
ArraySetAsSeries(date,true);
ArraySetAsSeries(price,true);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования эллипса
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- создадим эллипс
if(!EllipseCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpEllipseScale,
InpColor,InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точки привязки эллипса
//--- счетчик цикла
int v_steps=accuracy/5;
//--- перемещаем первую и вторую точки привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующие значения
if(p1<accuracy-1)
p1+=1;
if(p2>1)
p2-=1;
//--- сдвигаем точки
if(!EllipsePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!EllipsePointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.01 секунды
Sleep(10);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- начальное соотношение между временной и ценовой шкалами
double ellipse_scale=InpEllipseScale;
//--- счетчик цикла
v_steps=100;
//--- будем изменять соотношение между временной и ценовой шкалами
for(int i=0;i<v_steps;i++)
{
ellipse_scale+=2.0/v_steps;
//--- установим соотношение между временной и ценовой шкалами
if (!ObjectSetDouble(0,InpName,OBJPROP_SCALE,ellipse_scale)) return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.02 секунды
Sleep(20);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим эллипс с графика
EllipseDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_ARROW_THUMB_UP

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ARROW_THUMB_UP

OBJ_ARROW_THUMB_UP

Знак "Хорошо".

Примечание

Положение точки привязки относительно знака можно выбрать из перечисления ENUM_ARROW_ANCHOR.

Знаки большого размера (больше 5) можно создать только установив соответствующее значение свойства OBJPROP_WIDTH при написании кода в MetaEditor.

Пример

Следующий скрипт создает и перемещает на графике знак "Хорошо". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах.

#property strict
//--- описание
#property description "Скрипт рисует знак \"Хорошо\" (большой палец вверх)."
#property description "Координата точки привязки задается в процентах от"
#property description "размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="ThumbUp"; // Имя знака
input int InpDate=75; // Дата точки привязки в %
input int InpPrice=25; // Цена точки привязки в %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Способ привязки
input color InpColor=clrRed; // Цвет знака
input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Стиль окаймляющей линии
input int InpWidth=5; // Размер знака
input bool InpBack=false; // Знак на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает знак "Хорошо" |
//+------------------------------------------------------------------+
bool ArrowThumbUpCreate(const long chart_ID=0, // ID графика
const string name="ThumbUp", // имя знака
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // способ привязки
const color clr=clrRed, // цвет знака
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль окаймляющей линии
const int width=3, // размер знака
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeArrowEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим знак
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_THUMB_UP,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать знак \"Хорошо\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет знака
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль окаймляющей линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер знака
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения знака мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowThumbUpMove(const long chart_ID=0, // ID графика
const string name="ThumbUp", // имя объекта
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Меняет способ привязки знака "Хорошо" |
//+------------------------------------------------------------------+
bool ArrowThumbUpAnchorChange(const long chart_ID=0, // ID графика
const string name="ThumbUp", // имя объекта
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // способ привязки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим способ привязки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": не удалось изменить способ привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет знак "Хорошо" |
//+------------------------------------------------------------------+
bool ArrowThumbUpDelete(const long chart_ID=0, // ID графика
const string name="ThumbUp") // имя знака
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим знак
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить знак \"Хорошо\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точки привязки знака
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования знака
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- создадим знак "Хорошо" на графике
if(!ArrowThumbUpCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точку привязки и менять ее положение относительно знака
//--- счетчик цикла
int h_steps=bars/4;
//--- перемещаем точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d>1)
d-=1;
//--- сдвигаем точку
if(!ArrowThumbUpMove(0,InpName,date[d],price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
int v_steps=accuracy/4;
//--- перемещаем точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p<accuracy-1)
p+=1;
//--- сдвигаем точку
if(!ArrowThumbUpMove(0,InpName,date[d],price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- меняем положение точки привязки относительно знака
ArrowThumbUpAnchorChange(0,InpName,ANCHOR_BOTTOM);
//--- перерисуем график
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим знак с графика
ArrowThumbUpDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_ARROW_THUMB_DOWN

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ARROW_THUMB_DOWN

OBJ_ARROW_THUMB_DOWN

Знак "Плохо".

Примечание

Положение точки привязки относительно знака можно выбрать из перечисления ENUM_ARROW_ANCHOR.

Знаки большого размера (больше 5) можно создать только установив соответствующее значение свойства OBJPROP_WIDTH при написании кода в MetaEditor.

Пример

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

#property strict
//--- описание
#property description "Скрипт рисует знак \"Плохо\" (большой палец вниз)."
#property description "Координата точки привязки задается в процентах от"
#property description "размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="ThumbDown"; // Имя знака
input int InpDate=25; // Дата точки привязки в %
input int InpPrice=75; // Цена точки привязки в %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_BOTTOM; // Способ привязки
input color InpColor=clrRed; // Цвет знака
input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Стиль окаймляющей линии
input int InpWidth=5; // Размер знака
input bool InpBack=false; // Знак на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает знак "Плохо" |
//+------------------------------------------------------------------+
bool ArrowThumbDownCreate(const long chart_ID=0, // ID графика
const string name="ThumbDown", // имя знака
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // способ привязки
const color clr=clrRed, // цвет знака
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль окаймляющей линии
const int width=3, // размер знака
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeArrowEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим знак
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_THUMB_DOWN,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать знак \"Плохо\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет знака
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль окаймляющей линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер знака
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения знака мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowThumbDownMove(const long chart_ID=0, // ID графика
const string name="ThumbDown", // имя объекта
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Меняет способ привязки знака "Плохо" |
//+------------------------------------------------------------------+
bool ArrowThumbDownAnchorChange(const long chart_ID=0, // ID графика
const string name="ThumbDown", // имя объекта
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // способ привязки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим способ привязки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": не удалось изменить способ привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет знак "Плохо" |
//+------------------------------------------------------------------+
bool ArrowThumbDownDelete(const long chart_ID=0, // ID графика
const string name="ThumbDown") // имя знака
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим знак
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить знак \"Плохо\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точки привязки знака
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования знака
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- создадим знак "Плохо" на графике
if(!ArrowThumbDownCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точку привязки и менять ее положение относительно знака
//--- счетчик цикла
int h_steps=bars/4;
//--- перемещаем точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d<bars-1)
d+=1;
//--- сдвигаем точку
if(!ArrowThumbDownMove(0,InpName,date[d],price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- счетчик цикла
int v_steps=accuracy/4;
//--- перемещаем точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p>1)
p-=1;
//--- сдвигаем точку
if(!ArrowThumbDownMove(0,InpName,date[d],price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- меняем положение точки привязки относительно знака
ArrowThumbDownAnchorChange(0,InpName,ANCHOR_TOP);
//--- перерисуем график
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим знак с графика
ArrowThumbDownDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_ARROW_UP

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ARROW_UP

OBJ_ARROW_UP

Знак "Стрелка вверх".

Примечание

Положение точки привязки относительно знака можно выбрать из перечисления ENUM_ARROW_ANCHOR.

Знаки большого размера (больше 5) можно создать только установив соответствующее значение свойства OBJPROP_WIDTH при написании кода в MetaEditor.

Пример

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

#property strict
//--- описание
#property description "Скрипт рисует знак \"Стрелка вверх\"."
#property description "Координата точки привязки задается в"
#property description "процентах от размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="ArrowUp"; // Имя знака
input int InpDate=25; // Дата точки привязки в %
input int InpPrice=25; // Цена точки привязки в %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Способ привязки
input color InpColor=clrRed; // Цвет знака
input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Стиль окаймляющей линии
input int InpWidth=5; // Размер знака
input bool InpBack=false; // Знак на заднем плане
input bool InpSelection=false; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает знак "Стрелка вверх" |
//+------------------------------------------------------------------+
bool ArrowUpCreate(const long chart_ID=0, // ID графика
const string name="ArrowUp", // имя знака
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // способ привязки
const color clr=clrRed, // цвет знака
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль окаймляющей линии
const int width=3, // размер знака
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeArrowEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим знак
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_UP,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать знак \"Стрелка вверх\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет знака
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль окаймляющей линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер знака
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения знака мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowUpMove(const long chart_ID=0, // ID графика
const string name="ArrowUp", // имя объекта
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Меняет способ привязки знака "Стрелка вверх" |
//+------------------------------------------------------------------+
bool ArrowUpAnchorChange(const long chart_ID=0, // ID графика
const string name="ArrowUp", // имя объекта
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // способ привязки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим положение точки привязки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": не удалось изменить способ привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет знак "Стрелка вверх" |
//+------------------------------------------------------------------+
bool ArrowUpDelete(const long chart_ID=0, // ID графика
const string name="ArrowUp") // имя знака
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим знак
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить знак \"Стрелка вверх\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точки привязки знака
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования знака
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- создадим знак "Стрелка вверх" на графике
if(!ArrowUpCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точку привязки и менять ее положение относительно знака
//--- счетчик цикла
int v_steps=accuracy/2;
//--- перемещаем точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p<accuracy-1)
p+=1;
//--- сдвигаем точку
if(!ArrowUpMove(0,InpName,date[d],price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- меняем положение точки привязки относительно знака
ArrowUpAnchorChange(0,InpName,ANCHOR_BOTTOM);
//--- перерисуем график
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим знак с графика
ArrowUpDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_ARROW_DOWN

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ARROW_DOWN

OBJ_ARROW_DOWN

Знак "Стрелка вниз".

Примечание

Положение точки привязки относительно знака можно выбрать из перечисления ENUM_ARROW_ANCHOR.

Знаки большого размера (больше 5) можно создать только установив соответствующее значение свойства OBJPROP_WIDTH при написании кода в MetaEditor.

Пример

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

#property strict
//--- описание
#property description "Скрипт рисует знак \"Стрелка вниз\"."
#property description "Координата точки привязки задается в"
#property description "процентах от размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="ArrowDown"; // Имя знака
input int InpDate=75; // Дата точки привязки в %
input int InpPrice=75; // Цена точки привязки в %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_BOTTOM; // Способ привязки
input color InpColor=clrRed; // Цвет знака
input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Стиль окаймляющей линии
input int InpWidth=5; // Размер знака
input bool InpBack=false; // Знак на заднем плане
input bool InpSelection=false; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает знак "Стрелка вниз" |
//+------------------------------------------------------------------+
bool ArrowDownCreate(const long chart_ID=0, // ID графика
const string name="ArrowDown", // имя знака
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // способ привязки
const color clr=clrRed, // цвет знака
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль окаймляющей линии
const int width=3, // размер знака
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeArrowEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим знак
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_DOWN,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать знак \"Стрелка вниз\"! Код ошибки = ",GetLastError());
return(false);
}
//--- способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет знака
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль окаймляющей линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер знака
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения знака мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowDownMove(const long chart_ID=0, // ID графика
const string name="ArrowDown", // имя объекта
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Меняет способ привязки знака "Стрелка вниз" |
//+------------------------------------------------------------------+
bool ArrowDownAnchorChange(const long chart_ID=0, // ID графика
const string name="ArrowDown", // имя объекта
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // способ привязки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим положение точки привязки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": не удалось изменить способ привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет знак "Стрелка вниз" |
//+------------------------------------------------------------------+
bool ArrowDownDelete(const long chart_ID=0, // ID графика
const string name="ArrowDown") // имя знака
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим знак
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить знак \"Стрелка вниз\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точки привязки знака
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования знака
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- создадим знак "Стрелка вниз" на графике
if(!ArrowDownCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точку привязки и менять ее положение относительно знака
//--- счетчик цикла
int v_steps=accuracy/2;
//--- перемещаем точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p>1)
p-=1;
//--- сдвигаем точку
if(!ArrowDownMove(0,InpName,date[d],price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- меняем положение точки привязки относительно знака
ArrowDownAnchorChange(0,InpName,ANCHOR_TOP);
//--- перерисуем график
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим знак с графика
ArrowDownDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_ARROW_STOP

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ARROW_STOP

OBJ_ARROW_STOP

Знак "Стоп".

Примечание

Положение точки привязки относительно знака можно выбрать из перечисления ENUM_ARROW_ANCHOR.

Знаки большого размера (больше 5) можно создать только установив соответствующее значение свойства OBJPROP_WIDTH при написании кода в MetaEditor.

Пример

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

#property strict
//--- описание
#property description "Скрипт рисует знак \"Стоп\"."
#property description "Координата точки привязки задается в"
#property description "процентах от размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="ArrowStop"; // Имя знака
input int InpDate=10; // Дата точки привязки в %
input int InpPrice=50; // Цена точки привязки в %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_BOTTOM; // Способ привязки
input color InpColor=clrRed; // Цвет знака
input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Стиль окаймляющей линии
input int InpWidth=5; // Размер знака
input bool InpBack=false; // Знак на заднем плане
input bool InpSelection=false; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает знак "Стоп" |
//+------------------------------------------------------------------+
bool ArrowStopCreate(const long chart_ID=0, // ID графика
const string name="ArrowStop", // имя знака
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // способ привязки
const color clr=clrRed, // цвет знака
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль окаймляющей линии
const int width=3, // размер знака
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeArrowEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим знак
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_STOP,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать знак \"Стоп\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет знака
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль окаймляющей линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер знака
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения знака мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowStopMove(const long chart_ID=0, // ID графика
const string name="ArrowStop", // имя объекта
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Меняет способ привязки знака "Стоп" |
//+------------------------------------------------------------------+
bool ArrowStopAnchorChange(const long chart_ID=0, // ID графика
const string name="ArrowStop", // имя объекта
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // положение точки привязки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим способ привязки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": не удалось изменить способ привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет знак "Стоп" |
//+------------------------------------------------------------------+
bool ArrowStopDelete(const long chart_ID=0, // ID графика
const string name="ArrowStop") // имя знака
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим знак
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить знак \"Стоп\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точки привязки знака
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования знака
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- создадим знак "Стоп" на графике
if(!ArrowStopCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точку привязки и менять ее положение относительно знака
//--- счетчик цикла
int h_steps=bars*2/5;
//--- перемещаем точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d<bars-1)
d+=1;
//--- сдвигаем точку
if(!ArrowStopMove(0,InpName,date[d],price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.025 секунды
Sleep(25);
}
//--- меняем положение точки привязки относительно знака
ArrowStopAnchorChange(0,InpName,ANCHOR_TOP);
//--- перерисуем график
ChartRedraw();
//--- счетчик цикла
h_steps=bars*2/5;
//--- перемещаем точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d<bars-1)
d+=1;
//--- сдвигаем точку
if(!ArrowStopMove(0,InpName,date[d],price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.025 секунды
Sleep(25);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим знак с графика
ArrowStopDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_ARROW_CHECK

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ARROW_CHECK

OBJ_ARROW_CHECK

Знак "Галка".

Примечание

Положение точки привязки относительно знака можно выбрать из перечисления ENUM_ARROW_ANCHOR.

Знаки большого размера (больше 5) можно создать только установив соответствующее значение свойства OBJPROP_WIDTH при написании кода в MetaEditor.

Пример

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

#property strict
//--- описание
#property description "Скрипт рисует знак \"Галка\"."
#property description "Координата точки привязки задается в"
#property description "процентах от размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="ArrowCheck"; // Имя знака
input int InpDate=10; // Дата точки привязки в %
input int InpPrice=50; // Цена точки привязки в %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Способ привязки
input color InpColor=clrRed; // Цвет знака
input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Стиль окаймляющей линии
input int InpWidth=5; // Размер знака
input bool InpBack=false; // Знак на заднем плане
input bool InpSelection=false; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает знак "Галка" |
//+------------------------------------------------------------------+
bool ArrowCheckCreate(const long chart_ID=0, // ID графика
const string name="ArrowCheck", // имя знака
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // способ привязки
const color clr=clrRed, // цвет знака
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль окаймляющей линии
const int width=3, // размер знака
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeArrowEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим знак
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_CHECK,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать знак \"Галка\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет знака
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль окаймляющей линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер знака
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения знака мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установи приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowCheckMove(const long chart_ID=0, // ID графика
const string name="ArrowCheck", // имя объекта
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Меняет способ привязки "Галки" |
//+------------------------------------------------------------------+
bool ArrowCheckAnchorChange(const long chart_ID=0, // ID графика
const string name="ArrowCheck", // имя объекта
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // способ привязки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим способ привязки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": не удалось изменить способ привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет знак "Галка" |
//+------------------------------------------------------------------+
bool ArrowCheckDelete(const long chart_ID=0, // ID графика
const string name="ArrowCheck") // имя знака
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим знак
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить знак \"Галка\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точки привязки знака
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования знака
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- создадим знак "Галка" на графике
if(!ArrowCheckCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точку привязки и менять ее положение относительно знака
//--- счетчик цикла
int h_steps=bars*2/5;
//--- перемещаем точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d<bars-1)
d+=1;
//--- сдвигаем точку
if(!ArrowCheckMove(0,InpName,date[d],price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.025 секунды
Sleep(25);
}
//--- меняем положение точки привязки относительно знака
ArrowCheckAnchorChange(0,InpName,ANCHOR_BOTTOM);
//--- перерисуем график
ChartRedraw();
//--- счетчик цикла
h_steps=bars*2/5;
//--- перемещаем точку привязки
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d<bars-1)
d+=1;
//--- сдвигаем точку
if(!ArrowCheckMove(0,InpName,date[d],price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.025 секунды
Sleep(25);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим знак с графика
ArrowCheckDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_ARROW_LEFT_PRICE

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ARROW_LEFT_PRICE

OBJ_ARROW_LEFT_PRICE

Левая ценовая метка.

Пример

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

#property strict
//--- описание
#property description "Скрипт создает левую ценовую метку на графике."
#property description "Координата точки привязки задается в процентах"
#property description "от размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="LeftPrice"; // Имя ценовой метки
input int InpDate=100; // Дата точки привязки в %
input int InpPrice=10; // Цена точки привязки в %
input color InpColor=clrRed; // Цвет ценовой метки
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Стиль окаймляющей линии
input int InpWidth=2; // Размер ценовой метки
input bool InpBack=false; // Метка на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает левую ценовую метку |
//+------------------------------------------------------------------+
bool ArrowLeftPriceCreate(const long chart_ID=0, // ID графика
const string name="LeftPrice", // имя ценовой метки
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const color clr=clrRed, // цвет ценовой метки
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль окаймляющей линии
const int width=1, // размер ценовой метки
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeArrowEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим ценовую метку
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_LEFT_PRICE,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать левую ценовую метку! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет метки
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль окаймляющей линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер метки
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowLeftPriceMove(const long chart_ID=0, // ID графика
const string name="LeftPrice", // имя метки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет левую ценовую метку с графика |
//+------------------------------------------------------------------+
bool ArrowLeftPriceDelete(const long chart_ID=0, // ID графика
const string name="LeftPrice") // имя метки
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим метку
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить левую ценовую метку! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точки привязки метки
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования метки
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- создадим левую ценовую метку на графике
if(!ArrowLeftPriceCreate(0,InpName,0,date[d],price[p],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точку привязки
//--- счетчик цикла
int v_steps=accuracy*4/5;
//--- перемещаем точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p<accuracy-1)
p+=1;
//--- сдвигаем точку
if(!ArrowLeftPriceMove(0,InpName,date[d],price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим метку с графика
ArrowLeftPriceDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_ARROW_RIGHT_PRICE

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ARROW_RIGHT_PRICE

OBJ_ARROW_RIGHT_PRICE

Правая ценовая метка.

Пример

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

#property strict
//--- описание
#property description "Скрипт создает правую ценовую метку на графике."
#property description "Координата точки привязки задается в процентах"
#property description "от размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="RightPrice"; // Имя ценовой метки
input int InpDate=0; // Дата точки привязки в %
input int InpPrice=90; // Цена точки привязки в %
input color InpColor=clrRed; // Цвет ценовой метки
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Стиль окаймляющей линии
input int InpWidth=2; // Размер ценовой метки
input bool InpBack=false; // Метка на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает правую ценовую метку |
//+------------------------------------------------------------------+
bool ArrowRightPriceCreate(const long chart_ID=0, // ID графика
const string name="RightPrice", // имя ценовой метки
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const color clr=clrRed, // цвет ценовой метки
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль окаймляющей линии
const int width=1, // размер ценовой метки
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeArrowEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим ценовую метку
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_RIGHT_PRICE,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать правую ценовую метку! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет метки
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль окаймляющей линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер метки
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowRightPriceMove(const long chart_ID=0, // ID графика
const string name="RightPrice", // имя метки
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет правую ценовую метку с графика |
//+------------------------------------------------------------------+
bool ArrowRightPriceDelete(const long chart_ID=0, // ID графика
const string name="RightPrice") // имя метки
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим метку
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить правую ценовую метку! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точки привязки метки
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования метки
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- создадим правую ценовую метку на графике
if(!ArrowRightPriceCreate(0,InpName,0,date[d],price[p],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать точку привязки
//--- счетчик цикла
int v_steps=accuracy*4/5;
//--- перемещаем точку привязки
for(int i=0;i<v_steps;i++)
{
//--- возьмем следующее значение
if(p>1)
p-=1;
//--- сдвигаем точку
if(!ArrowRightPriceMove(0,InpName,date[d],price[p]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим метку с графика
ArrowRightPriceDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_ARROW_BUY

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ARROW_BUY

OBJ_ARROW_BUY

Знак "Buy".

Пример

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

#property strict
//--- описание
#property description "Скрипт рисует значки \"Buy\" в окне графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input color InpColor=C'3,95,172'; // Цвет значков
//+------------------------------------------------------------------+
//| Создает знак "Buy" |
//+------------------------------------------------------------------+
bool ArrowBuyCreate(const long chart_ID=0, // ID графика
const string name="ArrowBuy", // имя знака
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const color clr=C'3,95,172', // цвет знака
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии (при выделении)
const int width=1, // размер линии (при выделении)
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeArrowEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим знак
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_BUY,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать знак \"Buy\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет знака
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии (при выделении)
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер линии (при выделении)
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения знака мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установи приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowBuyMove(const long chart_ID=0, // ID графика
const string name="ArrowBuy", // имя объекта
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет знак "Buy" |
//+------------------------------------------------------------------+
bool ArrowBuyDelete(const long chart_ID=0, // ID графика
const string name="ArrowBuy") // имя знака
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим знак
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить знак \"Buy\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date[]; // массив для хранения дат видимых баров
double low[]; // массив для хранения цен Low видимых баров
double high[]; // массив для хранения цен High видимых баров
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(low,bars);
ArrayResize(high,bars);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен Low
if(CopyLow(Symbol(),Period(),0,bars,low)==-1)
{
Print("Не удалось скопировать значения цен Low! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен High
if(CopyHigh(Symbol(),Period(),0,bars,high)==-1)
{
Print("Не удалось скопировать значения цен High! Код ошибки = ",GetLastError());
return;
}
//--- создадим значки "Buy" в точке Low для каждого видимого бара
for(int i=0;i<bars;i++)
{
if(!ArrowBuyCreate(0,"ArrowBuy_"+(string)i,0,date[i],low[i],InpColor))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- переместим значки "Buy" в точку High для каждого видимого бара
for(int i=0;i<bars;i++)
{
if(!ArrowBuyMove(0,"ArrowBuy_"+(string)i,date[i],high[i]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- удалим значки "Buy"
for(int i=0;i<bars;i++)
{
if(!ArrowBuyDelete(0,"ArrowBuy_"+(string)i))
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//---
}


OBJ_ARROW_SELL

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ARROW_SELL

OBJ_ARROW_SELL

Знак "Sell".

Пример

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

#property strict
//--- описание
#property description "Скрипт рисует значки \"Sell\" в окне графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input color InpColor=C'225,68,29'; // Цвет значков
//+------------------------------------------------------------------+
//| Создает знак "Sell" |
//+------------------------------------------------------------------+
bool ArrowSellCreate(const long chart_ID=0, // ID графика
const string name="ArrowSell", // имя знака
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const color clr=C'225,68,29', // цвет знака
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии (при выделении)
const int width=1, // размер линии (при выделении)
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeArrowEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим знак
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_SELL,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать знак \"Sell\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет знака
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии (при выделении)
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер линии (при выделении)
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения знака мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowSellMove(const long chart_ID=0, // ID графика
const string name="ArrowSell", // имя объекта
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет знак "Sell" |
//+------------------------------------------------------------------+
bool ArrowSellDelete(const long chart_ID=0, // ID графика
const string name="ArrowSell") // имя знака
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим знак
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить знак \"Sell\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки, и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date[]; // массив для хранения дат видимых баров
double low[]; // массив для хранения цен Low видимых баров
double high[]; // массив для хранения цен High видимых баров
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(low,bars);
ArrayResize(high,bars);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен Low
if(CopyLow(Symbol(),Period(),0,bars,low)==-1)
{
Print("Не удалось скопировать значения цен Low! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен High
if(CopyHigh(Symbol(),Period(),0,bars,high)==-1)
{
Print("Не удалось скопировать значения цен High! Код ошибки = ",GetLastError());
return;
}
//--- создадим значки "Sell" в точке High для каждого видимого бара
for(int i=0;i<bars;i++)
{
if(!ArrowSellCreate(0,"ArrowSell_"+(string)i,0,date[i],high[i],InpColor))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- переместим значки "Sell" в точку Low для каждого видимого бара
for(int i=0;i<bars;i++)
{
if(!ArrowSellMove(0,"ArrowSell_"+(string)i,date[i],low[i]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- удалим значки "Sell"
for(int i=0;i<bars;i++)
{
if(!ArrowSellDelete(0,"ArrowSell_"+(string)i))
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//---
}


OBJ_ARROW

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ARROW

OBJ_ARROW

Объект "Стрелка".

Примечание

Положение точки привязки относительно стрелки можно выбрать из перечисления ENUM_ARROW_ANCHOR.

Стрелки большого размера (больше 5) можно создать только установив соответствующее значение свойства OBJPROP_WIDTH при написании кода в MetaEditor.

Нужный тип стрелки можно выбрать, установив один из кодов символов шрифта Wingdings.

Пример

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

#property strict
//--- описание
#property description "Скрипт создает произвольную стрелку в окне графика."
#property description "Координата точки привязки задается в процентах"
#property description "от размеров окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Arrow"; // Имя стрелки
input int InpDate=50; // Дата точки привязки в %
input int InpPrice=50; // Цена точки привязки в %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Способ привязки
input color InpColor=clrDodgerBlue; // Цвет стрелки
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Стиль окаймляющей линии
input int InpWidth=10; // Размер стрелки
input bool InpBack=false; // Стрелка на заднем плане
input bool InpSelection=false; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает стрелку |
//+------------------------------------------------------------------+
bool ArrowCreate(const long chart_ID=0, // ID графика
const string name="Arrow", // имя стрелки
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const uchar arrow_code=252, // код стрелки
const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // положение точки привязки
const color clr=clrRed, // цвет стрелки
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль окаймляющей линии
const int width=3, // размер стрелки
const bool back=false, // на заднем плане
const bool selection=true, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeArrowEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим стрелку
if(!ObjectCreate(chart_ID,name,OBJ_ARROW,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать стрелку! Код ошибки = ",GetLastError());
return(false);
}
//--- установим код стрелки
ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,arrow_code);
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет стрелки
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль окаймляющей линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер стрелки
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения стрелки мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool ArrowMove(const long chart_ID=0, // ID графика
const string name="Arrow", // имя объекта
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Меняет код стрелки |
//+------------------------------------------------------------------+
bool ArrowCodeChange(const long chart_ID=0, // ID графика
const string name="Arrow", // имя объекта
const uchar code=252) // код стрелки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим код стрелки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,code))
{
Print(__FUNCTION__,
": не удалось изменить код стрелки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Меняет способ привязки |
//+------------------------------------------------------------------+
bool ArrowAnchorChange(const long chart_ID=0, // ID графика
const string name="Arrow", // имя объекта
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // способ привязки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим способ привязки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": не удалось изменить способ привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет стрелку |
//+------------------------------------------------------------------+
bool ArrowDelete(const long chart_ID=0, // ID графика
const string name="Arrow") // имя стрелки
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим стрелку
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить стрелку! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точки привязки знака
datetime date[];
double price[];
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- определим точки для рисования стрелки
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- создадим стрелку на графике
if(!ArrowCreate(0,InpName,0,date[d],price[p],32,InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график
ChartRedraw();
//--- в цикле рассмотрим все варианты построения стрелок
for(int i=33;i<256;i++)
{
if(!ArrowCodeChange(0,InpName,(uchar)i))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в полсекунды
Sleep(500);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим стрелку с графика
ArrowDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_TEXT

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_TEXT

OBJ_TEXT

Объект "Текст".

Примечание

Положение точки привязки относительно текста можно выбрать из перечисления ENUM_ANCHOR_POINT. Также можно менять угол наклона текста при помощи свойства OBJPROP_ANGLE.

Пример

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

#property strict
//--- описание
#property description "Скрипт создает графический объект \"Текст\"."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpFont="Arial"; // Шрифт
input int InpFontSize=10; // Размер шрифта
input color InpColor=clrRed; // Цвет
input double InpAngle=90.0; // Угол наклона в градусах
input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_LEFT; // Способ привязки
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=false; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает объект "Текст" |
//+------------------------------------------------------------------+
bool TextCreate(const long chart_ID=0, // ID графика
const string name="Text", // имя объекта
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const string text="Text", // сам текст
const string font="Arial", // шрифт
const int font_size=10, // размер шрифта
const color clr=clrRed, // цвет
const double angle=0.0, // наклон текста
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeTextEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим объект "Текст"
if(!ObjectCreate(chart_ID,name,OBJ_TEXT,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать объект \"Текст\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим текст
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим угол наклона текста
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения объекта мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает точку привязки |
//+------------------------------------------------------------------+
bool TextMove(const long chart_ID=0, // ID графика
const string name="Text", // имя объекта
datetime time=0, // координата времени точки привязки
double price=0) // координата цены точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет текст объекта |
//+------------------------------------------------------------------+
bool TextChange(const long chart_ID=0, // ID графика
const string name="Text", // имя объекта
const string text="Text") // текст
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим текст объекта
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
": не удалось изменить текст! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет объект "Текст" |
//+------------------------------------------------------------------+
bool TextDelete(const long chart_ID=0, // ID графика
const string name="Text") // имя объекта
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим объект
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить объект \"Текст\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeTextEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date[]; // массив для хранения дат видимых баров
double low[]; // массив для хранения цен Low видимых баров
double high[]; // массив для хранения цен High видимых баров
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(low,bars);
ArrayResize(high,bars);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен Low
if(CopyLow(Symbol(),Period(),0,bars,low)==-1)
{
Print("Не удалось скопировать значения цен Low! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен High
if(CopyHigh(Symbol(),Period(),0,bars,high)==-1)
{
Print("Не удалось скопировать значения цен High! Код ошибки = ",GetLastError());
return;
}
//--- определим, как часто надо делать надписи
int scale=(int)ChartGetInteger(0,CHART_SCALE);
//--- определим шаг
int step=1;
switch(scale)
{
case 0:
step=12;
break;
case 1:
step=6;
break;
case 2:
step=4;
break;
case 3:
step=2;
break;
}
//--- создадим надписи для значений High и Low баров (с промежутками)
for(int i=0;i<bars;i+=step)
{
//--- создаем надписи
if(!TextCreate(0,"TextHigh_"+(string)i,0,date[i],high[i],DoubleToString(high[i],5),InpFont,InpFontSize,
InpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
if(!TextCreate(0,"TextLow_"+(string)i,0,date[i],low[i],DoubleToString(low[i],5),InpFont,InpFontSize,
InpColor,-InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в полсекунды
Sleep(500);
//--- удалим надписи
for(int i=0;i<bars;i+=step)
{
if(!TextDelete(0,"TextHigh_"+(string)i))
return;
if(!TextDelete(0,"TextLow_"+(string)i))
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//---
}


OBJ_LABEL

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_LABEL

OBJ_LABEL

Объект "Текстовая метка".

Примечание

Для объектов OBJ_LABEL, OBJ_BITMAP_LABEL и OBJ_RECTANGLE_LABEL можно задавать угол графика, относительно которого позиционируется точка привязки объекта. Этот угол устанавливается через свойство объекта OBJPROP_CORNER, которое может иметь одно из четырех значений перечисления ENUM_BASE_CORNER:

Идентификатор | Описание
CORNER_LEFT_UPPER | Координаты точки привязки заданы относительно левого верхнего угла графика
CORNER_LEFT_LOWER | Координаты точки привязки заданы относительно левого нижнего угла графика
CORNER_RIGHT_LOWER | Координаты точки привязки заданы относительно правого нижнего угла графика
CORNER_RIGHT_UPPER | Координаты точки привязки заданы относительно правого верхнего угла графика

Положение самой точки привязки объекта задается свойством OBJPROP_ANCHOR и может быть одним из 9-ти значений перечисления ENUM_ANCHOR_POINT:

Идентификатор | Описание
ANCHOR_LEFT_UPPER | Точка привязки в левом верхнем углу
ANCHOR_LEFT | Точка привязки слева по центру
ANCHOR_LEFT_LOWER | Точка привязки в левом нижнем углу
ANCHOR_LOWER | Точка привязки снизу по центру
ANCHOR_RIGHT_LOWER | Точка привязки в правом нижнем углу
ANCHOR_RIGHT | Точка привязки справа по центру
ANCHOR_RIGHT_UPPER | Точка привязки в правом верхнем углу
ANCHOR_UPPER | Точка привязки сверху по центру
ANCHOR_CENTER | Точка привязки строго по центру объекта

Пример

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

#property strict
//--- описание
#property description "Скрипт создает графический объект \"Текстовая метка\"."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Label"; // Имя метки
input int InpX=150; // Расстояние по оси X
input int InpY=150; // Расстояние по оси Y
input string InpFont="Arial"; // Шрифт
input int InpFontSize=14; // Размер шрифта
input color InpColor=clrRed; // Цвет
input double InpAngle=0.0; // Угол наклона в градусах
input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_CENTER; // Способ привязки
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает текстовую метку |
//+------------------------------------------------------------------+
bool LabelCreate(const long chart_ID=0, // ID графика
const string name="Label", // имя метки
const int sub_window=0, // номер подокна
const int x=0, // координата по оси X
const int y=0, // координата по оси Y
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
const string text="Label", // текст
const string font="Arial", // шрифт
const int font_size=10, // размер шрифта
const color clr=clrRed, // цвет
const double angle=0.0, // наклон текста
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки
ResetLastError();
//--- создадим текстовую метку
if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
return(false);
}
//--- установим координаты метки
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим текст
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим угол наклона текста
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает текстовую метку |
//+------------------------------------------------------------------+
bool LabelMove(const long chart_ID=0, // ID графика
const string name="Label", // имя метки
const int x=0, // координата по оси X
const int y=0) // координата по оси Y
{
//--- сбросим значение ошибки
ResetLastError();
//--- переместим текстовую метку
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": не удалось переместить X-координату метки! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": не удалось переместить Y-координату метки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет угол графика для привязки метки |
//+------------------------------------------------------------------+
bool LabelChangeCorner(const long chart_ID=0, // ID графика
const string name="Label", // имя метки
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER) // угол графика для привязки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим угол привязки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner))
{
Print(__FUNCTION__,
": не удалось изменить угол привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет текст объекта |
//+------------------------------------------------------------------+
bool LabelTextChange(const long chart_ID=0, // ID графика
const string name="Label", // имя объекта
const string text="Text") // текст
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим текст объекта
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
": не удалось изменить текст! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет текстовую метку |
//+------------------------------------------------------------------+
bool LabelDelete(const long chart_ID=0, // ID графика
const string name="Label") // имя метки
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим метку
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить текстовую метку! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- запомним координаты метки в локальные переменные
int x=InpX;
int y=InpY;
//--- размеры окна графика
long x_distance;
long y_distance;
//--- определим размеры окна
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print("Не удалось получить ширину графика! Код ошибки = ",GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Не удалось получить высоту графика! Код ошибки = ",GetLastError());
return;
}
//--- проверим входные параметры на корректность
if(InpX<0 || InpX>x_distance-1 || InpY<0 || InpY>y_distance-1)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- подготовим начальный текст для метки
string text;
text=StringConcatenate("Левый верхний угол: ",x,",",y);
//--- создадим текстовую метку на графике
if(!LabelCreate(0,InpName,0,InpX,InpY,CORNER_LEFT_UPPER,text,InpFont,InpFontSize,
InpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем полсекунды
ChartRedraw();
Sleep(500);
//--- будем перемещать метку и одновременно менять ее текст
//--- количество итераций по осям
int h_steps=(int)(x_distance/2-InpX);
int v_steps=(int)(y_distance/2-InpY);
//--- переместим метку вниз
for(int i=0;i<v_steps;i++)
{
//--- меняем координату
y+=2;
//--- перемещаем метку и меняем ее текст
MoveAndTextChange(x,y,"Левый верхний угол: ");
}
//--- задержка в полсекунды
Sleep(500);
//--- переместим метку вправо
for(int i=0;i<h_steps;i++)
{
//--- меняем координату
x+=2;
//--- перемещаем метку и меняем ее текст
MoveAndTextChange(x,y,"Левый верхний угол: ");
}
//--- задержка в полсекунды
Sleep(500);
//--- переместим метку вверх
for(int i=0;i<v_steps;i++)
{
//--- меняем координату
y-=2;
//--- перемещаем метку и меняем ее текст
MoveAndTextChange(x,y,"Левый верхний угол: ");
}
//--- задержка в полсекунды
Sleep(500);
//--- переместим метку влево
for(int i=0;i<h_steps;i++)
{
//--- меняем координату
x-=2;
//--- перемещаем метку и меняем ее текст
MoveAndTextChange(x,y,"Левый верхний угол: ");
}
//--- задержка в полсекунды
Sleep(500);
//--- теперь переместим точку путем изменения угла привязки
//--- переместим в левый нижний угол
if(!LabelChangeCorner(0,InpName,CORNER_LEFT_LOWER))
return;
//--- изменим текст метки
text=StringConcatenate("Левый нижний угол: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- перерисуем график и подождем две секунды
ChartRedraw();
Sleep(2000);
//--- переместим в правый нижний угол
if(!LabelChangeCorner(0,InpName,CORNER_RIGHT_LOWER))
return;
//--- изменим текст метки
text=StringConcatenate("Правый нижний угол: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- перерисуем график и подождем две секунды
ChartRedraw();
Sleep(2000);
//--- переместим в правый верхний угол
if(!LabelChangeCorner(0,InpName,CORNER_RIGHT_UPPER))
return;
//--- изменим текст метки
text=StringConcatenate("Правый верхний угол: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- перерисуем график и подождем две секунды
ChartRedraw();
Sleep(2000);
//--- переместим в левый верхний угол
if(!LabelChangeCorner(0,InpName,CORNER_LEFT_UPPER))
return;
//--- изменим текст метки
text=StringConcatenate("Левый верхний угол: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- перерисуем график и подождем две секунды
ChartRedraw();
Sleep(2000);
//--- удалим метку
LabelDelete(0,InpName);
//--- перерисуем график и подождем полсекунды
ChartRedraw();
Sleep(500);
//---
}
//+------------------------------------------------------------------+
//| Функция перемещает объект и меняет его текст |
//+------------------------------------------------------------------+
bool MoveAndTextChange(const int x,const int y,string text)
{
//--- перемещаем метку
if(!LabelMove(0,InpName,x,y))
return(false);
//--- изменим текст метки
text=StringConcatenate(text,x,",",y);
if(!LabelTextChange(0,InpName,text))
return(false);
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return(false);
//--- перерисуем график
ChartRedraw();
// задержка в 0.01 секунды
Sleep(10);
//--- выход из функции
return(true);
}


OBJ_BUTTON

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BUTTON

OBJ_BUTTON

Объект "Кнопка".

Примечание

Координаты точки привязки задаются в пикселях. Можно выбрать угол привязки кнопки из перечисления ENUM_BASE_CORNER.

Пример

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

#property strict
//--- описание
#property description "Скрипт создает кнопку на графике."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Button"; // Имя кнопки
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Угол графика для привязки
input string InpFont="Arial"; // Шрифт
input int InpFontSize=14; // Размер шрифта
input color InpColor=clrBlack; // Цвет текста
input color InpBackColor=C'236,233,216'; // Цвет фона
input color InpBorderColor=clrNONE; // Цвет границы
input bool InpState=false; // Нажата/Отжата
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=false; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает кнопку |
//+------------------------------------------------------------------+
bool ButtonCreate(const long chart_ID=0, // ID графика
const string name="Button", // имя кнопки
const int sub_window=0, // номер подокна
const int x=0, // координата по оси X
const int y=0, // координата по оси Y
const int width=50, // ширина кнопки
const int height=18, // высота кнопки
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
const string text="Button", // текст
const string font="Arial", // шрифт
const int font_size=10, // размер шрифта
const color clr=clrBlack, // цвет текста
const color back_clr=C'236,233,216', // цвет фона
const color border_clr=clrNONE, // цвет границы
const bool state=false, // нажата/отжата
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки
ResetLastError();
//--- создадим кнопку
if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))
{
Print(__FUNCTION__,
": не удалось создать кнопку! Код ошибки = ",GetLastError());
return(false);
}
//--- установим координаты кнопки
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим текст
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим цвет текста
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим цвет фона
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- установим цвет границы
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- переведем кнопку в заданное состояние
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- включим (true) или отключим (false) режим перемещения кнопки мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает кнопку |
//+------------------------------------------------------------------+
bool ButtonMove(const long chart_ID=0, // ID графика
const string name="Button", // имя кнопки
const int x=0, // координата по оси X
const int y=0) // координата по оси Y
{
//--- сбросим значение ошибки
ResetLastError();
//--- переместим кнопку
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": не удалось переместить X-координату кнопки! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": не удалось переместить Y-координату кнопки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет размер кнопки |
//+------------------------------------------------------------------+
bool ButtonChangeSize(const long chart_ID=0, // ID графика
const string name="Button", // имя кнопки
const int width=50, // ширина кнопки
const int height=18) // высота кнопки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим размеры кнопки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": не удалось изменить ширину кнопки! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": не удалось изменить высоту кнопки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет угол графика для привязки кнопки |
//+------------------------------------------------------------------+
bool ButtonChangeCorner(const long chart_ID=0, // ID графика
const string name="Button", // имя кнопки
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER) // угол графика для привязки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим угол привязки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner))
{
Print(__FUNCTION__,
": не удалось изменить угол привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет текст кнопки |
//+------------------------------------------------------------------+
bool ButtonTextChange(const long chart_ID=0, // ID графика
const string name="Button", // имя кнопки
const string text="Text") // текст
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим текст объекта
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
": не удалось изменить текст! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет кнопку |
//+------------------------------------------------------------------+
bool ButtonDelete(const long chart_ID=0, // ID графика
const string name="Button") // имя кнопки
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим кнопку
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить кнопку! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- размеры окна графика
long x_distance;
long y_distance;
//--- определим размеры окна
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print("Не удалось получить ширину графика! Код ошибки = ",GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Не удалось получить высоту графика! Код ошибки = ",GetLastError());
return;
}
//--- определим шаг для изменения размеров кнопки
int x_step=(int)x_distance/32;
int y_step=(int)y_distance/32;
//--- установим координаты кнопки и ее размер
int x=(int)x_distance/32;
int y=(int)y_distance/32;
int x_size=(int)x_distance*15/16;
int y_size=(int)y_distance*15/16;
//--- создадим кнопку
if(!ButtonCreate(0,InpName,0,x,y,x_size,y_size,InpCorner,"Press",InpFont,InpFontSize,
InpColor,InpBackColor,InpBorderColor,InpState,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график
ChartRedraw();
//--- в цикле уменьшаем кнопку
int i=0;
while(i<13)
{
//--- задержка в полсекунды
Sleep(500);
//--- переведем кнопку в нажатое состояние
ObjectSetInteger(0,InpName,OBJPROP_STATE,true);
//--- перерисуем график и подождем 0.2 секунды
ChartRedraw();
Sleep(200);
//--- переопределим координаты и размер кнопки
x+=x_step;
y+=y_step;
x_size-=x_step*2;
y_size-=y_step*2;
//--- уменьшим кнопку
ButtonMove(0,InpName,x,y);
ButtonChangeSize(0,InpName,x_size,y_size);
//--- вернем кнопку в ненажатое состояние
ObjectSetInteger(0,InpName,OBJPROP_STATE,false);
//--- перерисуем график
ChartRedraw();
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- увеличим счетчик цикла
i++;
}
//--- задержка в полсекунды
Sleep(500);
//--- удалим кнопку
ButtonDelete(0,InpName);
ChartRedraw();
//--- подождем 1 секунду
Sleep(1000);
//---
}


OBJ_BITMAP

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BITMAP

OBJ_BITMAP

Объект "Рисунок".

Примечание

Для объекта "Рисунок" можно выбирать область видимости рисунка.

Пример

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

#property strict
//--- описание
#property description "Скрипт создает рисунок в окне графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpFile="\\Images\\dollar.bmp"; // Имя файла с картинкой
input int InpWidth=24; // X-координата области видимости
input int InpHeight=24; // Y-координата области видимости
input int InpXOffset=4; // Смещение области видимости по X
input int InpYOffset=4; // Смещение области видимости по Y
input color InpColor=clrRed; // Цвет рамки при выделении
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Стиль линии при выделении
input int InpPointWidth=1; // Размер точки для перемещений
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=false; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает рисунок в окне графика |
//+------------------------------------------------------------------+
bool BitmapCreate(const long chart_ID=0, // ID графика
const string name="Bitmap", // имя рисунка
const int sub_window=0, // номер подокна
datetime time=0, // время точки привязки
double price=0, // цена точки привязки
const string file="", // имя файла с картинкой
const int width=10, // X-координата области видимости
const int height=10, // Y-координата области видимости
const int x_offset=0, // смещение области видимости по X
const int y_offset=0, // смещение области видимости по Y
const color clr=clrRed, // цвет рамки при выделении
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии при выделении
const int point_width=1, // размер точки перемещения
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точки привязки, если они не заданы
ChangeBitmapEmptyPoint(time,price);
//--- сбросим значение ошибки
ResetLastError();
//--- создадим рисунок
if(!ObjectCreate(chart_ID,name,OBJ_BITMAP,sub_window,time,price))
{
Print(__FUNCTION__,
": не удалось создать рисунок в окне графика! Код ошибки = ",GetLastError());
return(false);
}
//--- установим путь к файлу с картинкой
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,file))
{
Print(__FUNCTION__,
": не удалось загрузить картинку! Код ошибки = ",GetLastError());
return(false);
}
//--- установим область видимости изображения; если значения ширины или высоты
//--- больше значений ширины и высоты (соответственно) исходного изображения, то
//--- оно не рисуется; если значения ширины и высоты меньше размеров изображения,
//--- то рисуется та его часть, которая соответствует этим размерам
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- установим, какая часть изображения должна показываться в области видимости
//--- по умолчанию это левая верхняя область изображения; значения позволяют
//--- произвести сдвиг от этого угла и отобразить другую часть изображения
ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset);
ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);
//--- установим цвет рамки при включенном режиме выделения объекта
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии рамки при включенном режиме выделения объекта
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер точки привязки, с помощью которой можно перемещать объект
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Устанавливает новую картинку для рисунка |
//+------------------------------------------------------------------+
bool BitmapSetImage(const long chart_ID=0, // ID графика
const string name="Bitmap", // имя рисунка
const string file="") // путь к файлу
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим путь к файлу с картинкой
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,file))
{
Print(__FUNCTION__,
": не удалось загрузить картинку! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает рисунок в окне графика |
//+------------------------------------------------------------------+
bool BitmapMove(const long chart_ID=0, // ID графика
const string name="Bitmap", // имя рисунка
datetime time=0, // время точки привязки
double price=0) // цена точки привязки
{
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
ResetLastError();
//--- переместим точку привязки
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет размер области видимости (размер рисунка) |
//+------------------------------------------------------------------+
bool BitmapChangeSize(const long chart_ID=0, // ID графика
const string name="Bitmap", // имя рисунка
const int width=0, // ширина рисунка
const int height=0) // высота рисунка
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим размеры рисунка
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": не удалось изменить ширину рисунка! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": не удалось изменить высоту рисунка! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет координату левого верхнего угла области видимости |
//+------------------------------------------------------------------+
bool BitmapMoveVisibleArea(const long chart_ID=0, // ID графика
const string name="Bitmap", // имя рисунка
const int x_offset=0, // координата X области видимости
const int y_offset=0) // координата Y области видимости
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим координаты области видимости рисунка
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset))
{
Print(__FUNCTION__,
": не удалось изменить X-координату области видимости! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset))
{
Print(__FUNCTION__,
": не удалось изменить Y-координату области видимости! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет рисунок |
//+------------------------------------------------------------------+
bool BitmapDelete(const long chart_ID=0, // ID графика
const string name="Bitmap") // имя рисунка
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим метку
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить рисунок! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений |
//| устанавливает значения по умолчанию |
//+------------------------------------------------------------------+
void ChangeBitmapEmptyPoint(datetime &time,double &price)
{
//--- если время точки не задано, то она будет на текущем баре
if(!time)
time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date[]; // массив для хранения дат видимых баров
double close[]; // массив для хранения цен Close
//--- имя файла с картинкой
string file="\\Images\\dollar.bmp";
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- выделение памяти
ArrayResize(date,bars);
ArrayResize(close,bars);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- заполним массив цен Close
if(CopyClose(Symbol(),Period(),0,bars,close)==-1)
{
Print("Не удалось скопировать значения цен Close! Код ошибки = ",GetLastError());
return;
}
//--- определим, как часто надо выводить картинки
int scale=(int)ChartGetInteger(0,CHART_SCALE);
//--- определим шаг
int step=1;
switch(scale)
{
case 0:
step=27;
break;
case 1:
step=14;
break;
case 2:
step=7;
break;
case 3:
step=4;
break;
case 4:
step=2;
break;
}
//--- создадим рисунки для значений High и Low баров (с промежутками)
for(int i=0;i<bars;i+=step)
{
//--- создаем рисунки
if(!BitmapCreate(0,"Bitmap_"+(string)i,0,date[i],close[i],InpFile,InpWidth,InpHeight,InpXOffset,
InpYOffset,InpColor,InpStyle,InpPointWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в полсекунды
Sleep(500);
//--- удалим значки "Sell"
for(int i=0;i<bars;i+=step)
{
if(!BitmapDelete(0,"Bitmap_"+(string)i))
return;
if(!BitmapDelete(0,"Bitmap_"+(string)i))
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//---
}


OBJ_BITMAP_LABEL

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BITMAP_LABEL

OBJ_BITMAP_LABEL

Объект "Графическая метка".

Примечание

Для объекта "Графическая метка" можно выбирать область видимости рисунка.

Для объектов OBJ_LABEL, OBJ_BITMAP_LABEL и OBJ_RECTANGLE_LABEL можно задавать угол графика, относительно которого позиционируется точка привязки объекта. Этот угол устанавливается через свойство объекта OBJPROP_CORNER, которое может иметь одно из четырех значений перечисления ENUM_BASE_CORNER:

Идентификатор | Описание
CORNER_LEFT_UPPER | Координаты точки привязки заданы относительно левого верхнего угла графика
CORNER_LEFT_LOWER | Координаты точки привязки заданы относительно левого нижнего угла графика
CORNER_RIGHT_LOWER | Координаты точки привязки заданы относительно правого нижнего угла графика
CORNER_RIGHT_UPPER | Координаты точки привязки заданы относительно правого верхнего угла графика

Положение самой точки привязки объекта задается свойством OBJPROP_ANCHOR и может быть одним из 9-ти значений перечисления ENUM_ANCHOR_POINT:

Идентификатор | Описание
ANCHOR_LEFT_UPPER | Точка привязки в левом верхнем углу
ANCHOR_LEFT | Точка привязки слева по центру
ANCHOR_LEFT_LOWER | Точка привязки в левом нижнем углу
ANCHOR_LOWER | Точка привязки снизу по центру
ANCHOR_RIGHT_LOWER | Точка привязки в правом нижнем углу
ANCHOR_RIGHT | Точка привязки справа по центру
ANCHOR_RIGHT_UPPER | Точка привязки в правом верхнем углу
ANCHOR_UPPER | Точка привязки сверху по центру
ANCHOR_CENTER | Точка привязки строго по центру объекта

Пример

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

#property strict
//--- описание
#property description "Скрипт создает объект \"Графическая метка\"."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="BmpLabel"; // Имя метки
input string InpFileOn="\\Images\\dollar.bmp"; // Имя файла для режима On
input string InpFileOff="\\Images\\euro.bmp"; // Имя файла для режима Off
input bool InpState=false; // Метка нажата/отжата
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Угол графика для привязки
input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_CENTER; // Способ привязки
input color InpColor=clrRed; // Цвет рамки при выделении
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Стиль линии при выделении
input int InpPointWidth=1; // Размер точки для перемещений
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=false; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает объект "Графическая метка" |
//+------------------------------------------------------------------+
bool BitmapLabelCreate(const long chart_ID=0, // ID графика
const string name="BmpLabel", // имя метки
const int sub_window=0, // номер подокна
const int x=0, // координата по оси X
const int y=0, // координата по оси Y
const string file_on="", // картинка в режиме On
const string file_off="", // картинка в режиме Off
const int width=0, // X-координата области видимости
const int height=0, // Y-координата области видимости
const int x_offset=10, // смещение области видимости по X
const int y_offset=10, // смещение области видимости по Y
const bool state=false, // нажата/отжата
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки
const color clr=clrRed, // цвет рамки при выделении
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии при выделении
const int point_width=1, // размер точки перемещения
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки
ResetLastError();
//--- создадим графическую метку
if(!ObjectCreate(chart_ID,name,OBJ_BITMAP_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
": не удалось создать объект \"Графическая метка\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим картинки для режимов On и Off
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,0,file_on))
{
Print(__FUNCTION__,
": не удалось загрузить картинку для режима On! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,1,file_off))
{
Print(__FUNCTION__,
": не удалось загрузить картинку для режима Off! Код ошибки = ",GetLastError());
return(false);
}
//--- установим координаты метки
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим область видимости изображения; если значения ширины или высоты
//--- больше значений ширины и высоты (соответственно) исходного изображения, то
//--- оно не рисуется; если значения ширины и высоты меньше размеров изображения,
//--- то рисуется та его часть, которая соответствует этим размерам
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- установим, какая часть изображения должна показываться в области видимости
//--- по умолчанию это левая верхняя область изображения; значения позволяют
//--- произвести сдвиг от этого угла и отобразить другую часть изображения
ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset);
ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);
//--- установим, в каком сотоянии находится метка (нажатом или отжатом)
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет рамки при включенном режиме выделения объекта
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии рамки при включенном режиме выделения объекта
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер точки привязки, с помощью которой можно перемещать объект
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Устанавливает новую картинку для объекта "Графическая метка" |
//+------------------------------------------------------------------+
bool BitmapLabelSetImage(const long chart_ID=0, // ID графика
const string name="BmpLabel", // имя метки
const int on_off=0, // модификатор (On или Off)
const string file="") // путь к файлу
{
//--- сбросим значение ошибки
ResetLastError();
//--- установим путь к файлу с картинкой
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,on_off,file))
{
Print(__FUNCTION__,
": не удалось загрузить картинку! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает объект "Графическая метка" |
//+------------------------------------------------------------------+
bool BitmapLabelMove(const long chart_ID=0, // ID графика
const string name="BmpLabel", // имя метки
const int x=0, // координата по оси X
const int y=0) // координата по оси Y
{
//--- сбросим значение ошибки
ResetLastError();
//--- переместим объект
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": не удалось переместить X-координату объекта! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": не удалось переместить Y-координату объекта! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет размер области видимости (размер объекта) |
//+------------------------------------------------------------------+
bool BitmapLabelChangeSize(const long chart_ID=0, // ID графика
const string name="BmpLabel", // имя метки
const int width=0, // ширина метки
const int height=0) // высота метки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим размеры объекта
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": не удалось изменить ширину объекта! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": не удалось изменить высоту объекта! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет координату левого верхнего угла области видимости |
//+------------------------------------------------------------------+
bool BitmapLabelMoveVisibleArea(const long chart_ID=0, // ID графика
const string name="BmpLabel", // имя метки
const int x_offset=0, // координата X области видимости
const int y_offset=0) // координата Y области видимости
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим координаты области видимости объекта
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset))
{
Print(__FUNCTION__,
": не удалось изменить X-координату области видимости! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset))
{
Print(__FUNCTION__,
": не удалось изменить Y-координату области видимости! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет объект "Графическая метка" |
//+------------------------------------------------------------------+
bool BitmapLabelDelete(const long chart_ID=0, // ID графика
const string name="BmpLabel") // имя метки
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим метку
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить объект \"Графическая метка\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- размеры окна графика
long x_distance;
long y_distance;
//--- определим размеры окна
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print("Не удалось получить ширину графика! Код ошибки = ",GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Не удалось получить высоту графика! Код ошибки = ",GetLastError());
return;
}
//--- определим координаты графической метки
int x=(int)x_distance/2;
int y=(int)y_distance/2;
//--- установим размеры метки и координаты области видимости
int width=32;
int height=32;
int x_offset=0;
int y_offset=0;
//--- разместим графическую метку по центру окна
if(!BitmapLabelCreate(0,InpName,0,x,y,InpFileOn,InpFileOff,width,height,x_offset,y_offset,InpState,
InpCorner,InpAnchor,InpColor,InpStyle,InpPointWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем одну секунду
ChartRedraw();
Sleep(1000);
//--- изменим размеры области видимости метки в цикле
for(int i=0;i<6;i++)
{
//--- изменим размеры области видимости
width--;
height--;
if(!BitmapLabelChangeSize(0,InpName,width,height))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.3 секунды
Sleep(300);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- изменим координаты области видимости метки в цикле
for(int i=0;i<2;i++)
{
//--- изменим координаты области видимости
x_offset++;
y_offset++;
if(!BitmapLabelMoveVisibleArea(0,InpName,x_offset,y_offset))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.3 секунды
Sleep(300);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим метку
BitmapLabelDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_EDIT

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_EDIT

OBJ_EDIT

Объект "Поле ввода".

Примечание

Координаты точки привязки задаются в пикселях. Можно выбрать угол привязки "Поля ввода" из перечисления ENUM_BASE_CORNER.

Также можно выбрать один из типов выравнивания текста внутри "Поля ввода" из перечисления ENUM_ALIGN_MODE.

Пример

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

#property strict
//--- описание
#property description "Скрипт создает объект \"Поле ввода\"."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Edit"; // Имя объекта
input string InpText="Text"; // Текст объекта
input string InpFont="Arial"; // Шрифт
input int InpFontSize=14; // Размер шрифта
input ENUM_ALIGN_MODE InpAlign=ALIGN_CENTER; // Способ выравнивания текста
input bool InpReadOnly=false; // Возможность редактировать
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Угол графика для привязки
input color InpColor=clrBlack; // Цвет текста
input color InpBackColor=clrWhite; // Цвет фона
input color InpBorderColor=clrBlack; // Цвет границы
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=false; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает объект "Поле ввода" |
//+------------------------------------------------------------------+
bool EditCreate(const long chart_ID=0, // ID графика
const string name="Edit", // имя объекта
const int sub_window=0, // номер подокна
const int x=0, // координата по оси X
const int y=0, // координата по оси Y
const int width=50, // ширина
const int height=18, // высота
const string text="Text", // текст
const string font="Arial", // шрифт
const int font_size=10, // размер шрифта
const ENUM_ALIGN_MODE align=ALIGN_CENTER, // способ выравнивания
const bool read_only=false, // возможность редактировать
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
const color clr=clrBlack, // цвет текста
const color back_clr=clrWhite, // цвет фона
const color border_clr=clrNONE, // цвет границы
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки
ResetLastError();
//--- создадим поле ввода
if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0))
{
Print(__FUNCTION__,
": не удалось создать объект \"Поле ввода\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим координаты объекта
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим размеры объекта
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- установим текст
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим способ выравнивания текста в объекте
ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,align);
//--- установим (true) или отменим (false) режим только для чтения
ObjectSetInteger(chart_ID,name,OBJPROP_READONLY,read_only);
//--- установим угол графика, относительно которого будут определяться координаты объекта
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим цвет текста
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим цвет фона
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- установим цвет границы
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает объект "Поле ввода" |
//+------------------------------------------------------------------+
bool EditMove(const long chart_ID=0, // ID графика
const string name="Edit", // имя объекта
const int x=0, // координата по оси X
const int y=0) // координата по оси Y
{
//--- сбросим значение ошибки
ResetLastError();
//--- переместим объект
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": не удалось переместить X-координату объекта! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": не удалось переместить Y-координату объекта! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет размеры объекта "Поле ввода" |
//+------------------------------------------------------------------+
bool EditChangeSize(const long chart_ID=0, // ID графика
const string name="Edit", // имя объекта
const int width=0, // ширина
const int height=0) // высота
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим размеры объекта
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": не удалось изменить ширину объекта! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": не удалось изменить высоту объекта! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет текст объекта "Поле ввода" |
//+------------------------------------------------------------------+
bool EditTextChange(const long chart_ID=0, // ID графика
const string name="Edit", // имя объекта
const string text="Text") // текст
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим текст объекта
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
": не удалось изменить текст! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Возвращает текст объекта "Поле ввода" |
//+------------------------------------------------------------------+
bool EditTextGet(string &text, // текст
const long chart_ID=0, // ID графика
const string name="Edit") // имя объекта
{
//--- сбросим значение ошибки
ResetLastError();
//--- получим текст объекта
if(!ObjectGetString(chart_ID,name,OBJPROP_TEXT,0,text))
{
Print(__FUNCTION__,
": не удалось получить текст! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет объект "Поле ввода" |
//+------------------------------------------------------------------+
bool EditDelete(const long chart_ID=0, // ID графика
const string name="Edit") // имя объекта
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим метку
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить объект \"Поле ввода\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- размеры окна графика
long x_distance;
long y_distance;
//--- определим размеры окна
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print("Не удалось получить ширину графика! Код ошибки = ",GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Не удалось получить высоту графика! Код ошибки = ",GetLastError());
return;
}
//--- определим шаг для изменения размеров поля ввода
int x_step=(int)x_distance/64;
//--- установим координаты поля ввода и его размер
int x=(int)x_distance/8;
int y=(int)y_distance/2;
int x_size=(int)x_distance/8;
int y_size=InpFontSize*2;
//--- запомним текст в локальную переменную
string text=InpText;
//--- создадим поле ввода
if(!EditCreate(0,InpName,0,x,y,x_size,y_size,InpText,InpFont,InpFontSize,InpAlign,InpReadOnly,
InpCorner,InpColor,InpBackColor,InpBorderColor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- растянем поле ввода
while(x_size-x<x_distance*5/8)
{
//--- увеличим ширину поля ввода
x_size+=x_step;
if(!EditChangeSize(0,InpName,x_size,y_size))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график и подождем 0.05 секунды
ChartRedraw();
Sleep(50);
}
//--- задержка в полсекунды
Sleep(500);
//--- изменим текст
for(int i=0;i<20;i++)
{
//--- прибавим "+" в начале и конце
text="+"+text+"+";
if(!EditTextChange(0,InpName,text))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график и подождем 0.1 секунды
ChartRedraw();
Sleep(100);
}
//--- задержка в полсекунды
Sleep(500);
//--- удалим поле ввода
EditDelete(0,InpName);
ChartRedraw();
//--- подождем 1 секунду
Sleep(1000);
//---
}


OBJ_EVENT

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_EVENT

OBJ_EVENT

Объект "Событие".

Примечание

При наведении на событие курсора мыши, всплывает его текст.

Пример

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

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Событие\"."
#property description "Дата точки привязки задается в процентах от"
#property description "ширины окна графика в барах."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="Event"; // Имя события
input int InpDate=25; // Дата события в %
input string InpText="Text"; // Текст события
input color InpColor=clrRed; // Цвет события
input int InpWidth=1; // Размер точки при выделении
input bool InpBack=false; // Событие на заднем плане
input bool InpSelection=false; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает объект "Событие" на графике |
//+------------------------------------------------------------------+
bool EventCreate(const long chart_ID=0, // ID графика
const string name="Event", // имя события
const int sub_window=0, // номер подокна
const string text="Text", // текст события
datetime time=0, // время
const color clr=clrRed, // цвет
const int width=1, // толщина точки при выделении
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- если время не задано, то создаем объект на последнем баре
if(!time)
time=TimeCurrent();
//--- сбросим значение ошибки
ResetLastError();
//--- создадим объект "Событие"
if(!ObjectCreate(chart_ID,name,OBJ_EVENT,sub_window,time,0))
{
Print(__FUNCTION__,
": не удалось создать объект \"Событие\"! Код ошибки = ",GetLastError());
return(false);
}
//--- установим текст события
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим толщину точки привязки, если объект выделен
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения события мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет текст объекта "Событие" |
//+------------------------------------------------------------------+
bool EventTextChange(const long chart_ID=0, // ID графика
const string name="Event", // имя события
const string text="Text") // текст
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим текст объекта
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
": не удалось изменить текст! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещение объект "Событие" |
//+------------------------------------------------------------------+
bool EventMove(const long chart_ID=0, // ID графика
const string name="Event", // имя события
datetime time=0) // время
{
//--- если время не задано, то перемещаем событие на последний бар
if(!time)
time=TimeCurrent();
//--- сбросим значение ошибки
ResetLastError();
//--- переместим объект
if(!ObjectMove(chart_ID,name,0,time,0))
{
Print(__FUNCTION__,
": не удалось переместить объект \"Событие\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет объект "Событие" |
//+------------------------------------------------------------------+
bool EventDelete(const long chart_ID=0, // ID графика
const string name="Event") // имя события
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим объект
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить объект \"Событие\"! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- проверим входные параметры на корректность
if(InpDate<0 || InpDate>100)
{
Print("Ошибка! Некорректные значения входных параметров!");
return;
}
//--- количество видимых баров в окне графика
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- массив для хранения значений дат, которые будут использованы
//--- для установки и изменения координаты точки привязки линии
datetime date[];
//--- выделение памяти
ArrayResize(date,bars);
//--- заполним массив дат
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
return;
}
//--- определим точки для создания объекта
int d=InpDate*(bars-1)/100;
//--- создадим объект "Событие"
if(!EventCreate(0,InpName,0,InpText,date[d],InpColor,InpWidth,
InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- теперь будем перемещать объект
//--- счетчик цикла
int h_steps=bars/2;
//--- перемещаем объект
for(int i=0;i<h_steps;i++)
{
//--- возьмем следующее значение
if(d<bars-1)
d+=1;
//--- сдвигаем точку
if(!EventMove(0,InpName,date[d]))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график
ChartRedraw();
// задержка в 0.05 секунды
Sleep(50);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- удалим канал с графика
EventDelete(0,InpName);
ChartRedraw();
//--- задержка в 1 секунду
Sleep(1000);
//---
}


OBJ_RECTANGLE_LABEL

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_RECTANGLE_LABEL

OBJ_RECTANGLE_LABEL

Объект "Прямоугольная метка".

Примечание

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

Для объектов OBJ_LABEL, OBJ_BITMAP_LABEL и OBJ_RECTANGLE_LABEL можно задавать угол графика, относительно которого позиционируется точка привязки объекта. Этот угол устанавливается через свойство объекта OBJPROP_CORNER, которое может иметь одно из четырех значений перечисления ENUM_BASE_CORNER:

Идентификатор | Описание
CORNER_LEFT_UPPER | Координаты точки привязки заданы относительно левого верхнего угла графика
CORNER_LEFT_LOWER | Координаты точки привязки заданы относительно левого нижнего угла графика
CORNER_RIGHT_LOWER | Координаты точки привязки заданы относительно правого нижнего угла графика
CORNER_RIGHT_UPPER | Координаты точки привязки заданы относительно правого верхнего угла графика

Пример

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

#property strict
//--- описание
#property description "Скрипт создает графический объект \"Прямоугольная метка\"."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string InpName="RectLabel"; // Имя метки
input color InpBackColor=clrSkyBlue; // Цвет фона
input ENUM_BORDER_TYPE InpBorder=BORDER_FLAT; // Тип рамки
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Угол графика для привязки
input color InpColor=clrDarkBlue; // Цвет плоской границы (Flat)
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Стиль плоской границы (Flat)
input int InpLineWidth=3; // Толщина плоской границы (Flat)
input bool InpBack=false; // Объект на заднем плане
input bool InpSelection=true; // Выделить для перемещений
input bool InpHidden=true; // Скрыт в списке объектов
input long InpZOrder=0; // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает прямоугольную метку |
//+------------------------------------------------------------------+
bool RectLabelCreate(const long chart_ID=0, // ID графика
const string name="RectLabel", // имя метки
const int sub_window=0, // номер подокна
const int x=0, // координата по оси X
const int y=0, // координата по оси Y
const int width=50, // ширина
const int height=18, // высота
const color back_clr=C'236,233,216', // цвет фона
const ENUM_BORDER_TYPE border=BORDER_SUNKEN, // тип границы
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
const color clr=clrRed, // цвет плоской границы (Flat)
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль плоской границы
const int line_width=1, // толщина плоской границы
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки
ResetLastError();
//--- создадим прямоугольную метку
if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
": не удалось создать прямоугольную метку! Код ошибки = ",GetLastError());
return(false);
}
//--- установим координаты метки
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим размеры метки
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- установим цвет фона
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- установим тип границы
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим цвет плоской рамки (в режиме Flat)
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии плоской рамки
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину плоской границы
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Перемещает прямоугольную метку |
//+------------------------------------------------------------------+
bool RectLabelMove(const long chart_ID=0, // ID графика
const string name="RectLabel", // имя метки
const int x=0, // координата по оси X
const int y=0) // координата по оси Y
{
//--- сбросим значение ошибки
ResetLastError();
//--- переместим прямоугольную метку
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": не удалось переместить X-координату метки! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": не удалось переместить Y-координату метки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет размер прямоугольной метки |
//+------------------------------------------------------------------+
bool RectLabelChangeSize(const long chart_ID=0, // ID графика
const string name="RectLabel", // имя метки
const int width=50, // ширина метки
const int height=18) // высота метки
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим размеры метки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": не удалось изменить ширину метки! Код ошибки = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": не удалось изменить высоту метки! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Изменяет тип границы прямоугольной метки |
//+------------------------------------------------------------------+
bool RectLabelChangeBorderType(const long chart_ID=0, // ID графика
const string name="RectLabel", // имя метки
const ENUM_BORDER_TYPE border=BORDER_SUNKEN) // тип границы
{
//--- сбросим значение ошибки
ResetLastError();
//--- изменим тип рамки
if(!ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border))
{
Print(__FUNCTION__,
": не удалось изменить тип границы! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Удаляет прямоугольную метку |
//+------------------------------------------------------------------+
bool RectLabelDelete(const long chart_ID=0, // ID графика
const string name="RectLabel") // имя метки
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим метку
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": не удалось удалить прямоугольную метку! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- размеры окна графика
long x_distance;
long y_distance;
//--- определим размеры окна
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print("Не удалось получить ширину графика! Код ошибки = ",GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Не удалось получить высоту графика! Код ошибки = ",GetLastError());
return;
}
//--- определим координаты прямоугольной метки
int x=(int)x_distance/4;
int y=(int)y_distance/4;
//--- установим размеры метки
int width=(int)x_distance/4;
int height=(int)y_distance/4;
//--- создадим прямоугольную метку
if(!RectLabelCreate(0,InpName,0,x,y,width,height,InpBackColor,InpBorder,InpCorner,
InpColor,InpStyle,InpLineWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- перерисуем график и подождем одну секунду
ChartRedraw();
Sleep(1000);
//--- изменим размер прямоугольной метки
int steps=(int)MathMin(x_distance/4,y_distance/4);
for(int i=0;i<steps;i++)
{
//--- изменим размеры
width+=1;
height+=1;
if(!RectLabelChangeSize(0,InpName,width,height))
return;
//--- проверим факт принудительного завершения скрипта
if(IsStopped())
return;
//--- перерисуем график и подождем 0.01 секунды
ChartRedraw();
Sleep(10);
}
//--- задержка в 1 секунду
Sleep(1000);
//--- изменим тип рамки
if(!RectLabelChangeBorderType(0,InpName,BORDER_RAISED))
return;
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- изменим тип рамки
if(!RectLabelChangeBorderType(0,InpName,BORDER_SUNKEN))
return;
//--- перерисуем график и подождем 1 секунду
ChartRedraw();
Sleep(1000);
//--- удалим метку
RectLabelDelete(0,InpName);
ChartRedraw();
//--- подождем 1 секунду
Sleep(1000);
//---
}


Свойства объектов

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Свойства объектов

Свойства объектов

Графические объекты могут иметь множество свойств в зависимости от типа объекта. Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д. Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов):

Объект | Идентификатор | X/Y | Width/Height | Date/Price | OBJPROP_CORNER | OBJPROP_ANCHOR | OBJPROP_ANGLE
Text | OBJ_TEXT | — | — | Да | — | Да | Да
Label | OBJ_LABEL | Да | Да (только для чтения) | — | Да | Да | Да
Button | OBJ_BUTTON | Да | Да | — | Да | — | —
Bitmap | OBJ_BITMAP | — | Да (только для чтения) | Да | — | Да | —
Bitmap Label | OBJ_BITMAP_LABEL | Да | Да (только для чтения) | — | Да | Да | —
Edit | OBJ_EDIT | Да | Да | — | Да | — | —
Rectangle Label | OBJ_RECTANGLE_LABEL | Да | Да | — | Да | — | —

В таблице использованы следующие обозначения:

  • X/Y – координаты точки привязки задаются в пикселях относительно одного из углов графика;
  • Width/Height – объекты имеет ширину и высоту. Если указано "только для чтения", то это означает, что значения ширины и высоты вычисляются только после отрисовки объекта на графике;
  • Date/Price – координаты точки привязки задаются парой дата/цена;
  • OBJPROP_CORNER – задаёт угол графика, относительно которого указываются координаты точки привязки. Может быть одним из 4-х значений перечисления ENUM_BASE_CORNER;
  • OBJPROP_ANCHOR – задаёт положение точки привязки в самом объекте, и может быть одним из 9-ти значений перечисления ENUM_ANCHOR_POINT. Именно от этой точки до выбранного угла графика указываются координаты в пикселях;
  • OBJPROP_ANGLE – задаёт угол поворота объекта против часовой стрелки.

Идентификаторы свойств объекта используются в функциях ObjectGet() и ObjectSet(). Могут быть любыми из следующих величин.

Константа | Значение | Тип | Описание
OBJPROP_TIME1 | 0 | datetime | Получает/устанавливает первую координату времени
OBJPROP_PRICE1 | 1 | double | Получает/устанавливает первую координату цены
OBJPROP_TIME2 | 2 | datetime | Получает/устанавливает вторую координату времени
OBJPROP_PRICE2 | 3 | double | Получает/устанавливает вторую координату цены
OBJPROP_TIME3 | 4 | datetime | Получает/устанавливает третью координату времени
OBJPROP_PRICE3 | 5 | double | Получает/устанавливает третью координату цены
OBJPROP_COLOR | 6 | color | Получает/устанавливает цвет объекта
OBJPROP_STYLE | 7 | int | Получает/устанавливает стиль линии объекта
OBJPROP_WIDTH | 8 | int | Получает/устанавливает ширину линии объекта
OBJPROP_BACK | 9 | bool | Получает/устанавливает флаг фонового отображения объекта
OBJPROP_RAY | 10 | bool | Получает/устанавливает флаг свойства луч для объектов типа OBJ_TREND и ему подобных
OBJPROP_ELLIPSE | 11 | bool | Получает/устанавливает флаг отображения полного эллипса для объекта OBJ_FIBOARC
OBJPROP_SCALE | 12 | double | Получает/устанавливает значение масштаба объекта
OBJPROP_ANGLE | 13 | double | Получает/устанавливает значение угла в градусах объекта OBJ_TRENDBYANGLE
OBJPROP_ARROWCODE | 14 | uchar | Получает/устанавливает код стрелки объекта OBJ_ARROW. Может быть одним из символов wingdings или один из предопределенных кодов стрелок
OBJPROP_TIMEFRAMES | 15 | int | Получает/устанавливает свойство отображения объекта на различных периодах. Может быть одним или комбинацией нескольких из констант видимости объекта
OBJPROP_DEVIATION | 16 | double | Получает/устанавливает размер отклонения для объекта OBJ_STDDEVCHANNEL
OBJPROP_FONTSIZE | 100 | int | Получает/устанавливает размер шрифта для объектов OBJ_TEXT и OBJ_LABEL
OBJPROP_CORNER | 101 | int | Получает/устанавливает номер угла привязки для объекта OBJ_LABEL. Принимает значения 0-3
OBJPROP_XDISTANCE | 102 | int | Получает/устанавливает расстояние X-координаты в пикселях относительно угла привязки (см. примечание)
OBJPROP_YDISTANCE | 103 | int | Получает/устанавливает расстояние Y-координаты в пикселях относительно угла привязки (см. примечание)
OBJPROP_FIBOLEVELS | 200 | int | Получает/устанавливает число уровней объекта Fibonacci. Может быть от 1 до 32
OBJPROP_LEVELCOLOR | 201 | color | Получает/устанавливает цвет линии уровня объекта
OBJPROP_LEVELSTYLE | 202 | int | Получает/устанавливает стиль линии уровня объекта
OBJPROP_LEVELWIDTH | 203 | int | Получает/устанавливает ширину линии уровня объекта
OBJPROP_FIRSTLEVEL+n | 210+n | int | Получает/устанавливает значения уровня объекта Fibonacci с индексом n. Индекс n может быть от 0 до (количество уровней -1), но не более 31

Каждый графический объект на графике цен имеет некоторый набор свойств. Установка и получение значений свойств объектов производится соответствующими функциями по работе с графическими объектами. Для каждого типа объекта есть свой набор свойств, здесь перечислены все возможные значения из семейства перечислений ENUM_OBJECT_PROPERTY. Некоторые свойства требуют уточнения, как например, номер уровня для объекта расширения Фибоначчи. В таких случаях необходимо в функциях ObjectSet...() и ObjectGet...() указывать значение параметра modifier.

Для функций ObjectSetInteger() и ObjectGetInteger()

ENUM_OBJECT_PROPERTY_INTEGER

Идентификатор | Описание | Тип свойства
OBJPROP_COLOR | Цвет | color
OBJPROP_STYLE | Стиль | ENUM_LINE_STYLE
OBJPROP_WIDTH | Толщина линии | int
OBJPROP_BACK | Объект на заднем плане | bool
OBJPROP_ZORDER | Приоритет графического объекта на получение события нажатия мышки на графике (CHARTEVENT_CLICK). По умолчанию при создании значение выставляется равным нулю, но при необходимости можно повысить приоритет. При наложении объектов друг на друга событие CHARTEVENT_CLICK получит только один объект, чей приоритет выше остальных. | long
OBJPROP_HIDDEN | Запрет на показ имени графического объекта в списке объектов из меню терминала "Графики" - "Объекты" - "Список объектов". Значение true позволяет скрыть ненужный для пользователя объект из списка. По умолчанию true устанавливается для объектов, которые отображают события календаря, историю торговли, а также для созданных из MQL5-программы. Для того чтобы увидеть такие графические объекты и получить доступ к их свойствам, нужно нажать кнопку "Все" в окне "Список объектов". | bool
OBJPROP_SELECTED | Выделенность объекта | bool
OBJPROP_READONLY | Возможность редактирования текста в объекте Edit | bool
OBJPROP_TYPE | Тип объекта | ENUM_OBJECT r/o
OBJPROP_TIME | Координата времени | datetime модификатор=номер точки привязки
OBJPROP_SELECTABLE | Доступность объекта | bool
OBJPROP_CREATETIME | Время создания объекта | datetime r/o
OBJPROP_LEVELS | Количество уровней | int
OBJPROP_LEVELCOLOR | Цвет линии-уровня | color модификатор=номер уровня
OBJPROP_LEVELSTYLE | Стиль линии-уровня | ENUM_LINE_STYLE модификатор=номер уровня
OBJPROP_LEVELWIDTH | Толщина линии-уровня | int модификатор=номер уровня
OBJPROP_ALIGN | Горизонтальное выравнивание текста в объекте "Поле ввода" (OBJ_EDIT) | ENUM_ALIGN_MODE
OBJPROP_FONTSIZE | Размер шрифта | int
OBJPROP_RAY_RIGHT | Луч продолжается вправо | bool
OBJPROP_ELLIPSE | Отображение полного эллипса для объекта "Дуги Фибоначчи" (OBJ_FIBOARC) | bool
OBJPROP_ARROWCODE | Код стрелки для объекта "Стрелка" | uchar
OBJPROP_TIMEFRAMES | Видимость объекта на таймфреймах | набор флагов flags
OBJPROP_ANCHOR | Положение точки привязки графического объекта | ENUM_ARROW_ANCHOR (для OBJ_ARROW), ENUM_ANCHOR_POINT (для OBJ_LABEL, OBJ_BITMAP_LABEL и OBJ_TEXT)
OBJPROP_XDISTANCE | Дистанция в пикселях по оси X от угла привязки (см. примечание) | int
OBJPROP_YDISTANCE | Дистанция в пикселях по оси Y от угла привязки (см. примечание) | int
OBJPROP_DRAWLINES | Отображение линий для волновой разметки Эллиота | bool
OBJPROP_STATE | Состояние кнопки (Нажата/Отжата) | bool
OBJPROP_XSIZE | Ширина объекта по оси X в пикселях. Задается для объектов OBJ_LABEL (read-only), OBJ_BUTTON, OBJ_BITMAP, OBJ_BITMAP_LABEL, OBJ_EDIT, OBJ_RECTANGLE_LABEL. | int
OBJPROP_YSIZE | Высота объекта по оси Y в пикселях. Задается для объектов OBJ_LABEL (read-only), OBJ_BUTTON, OBJ_BITMAP, OBJ_BITMAP_LABEL, OBJ_EDIT, OBJ_RECTANGLE_LABEL. | int
OBJPROP_XOFFSET | X-координата левого верхнего угла прямоугольной области видимости в графических объектах "Графическая метка" и "Рисунок" (OBJ_BITMAP_LABEL и OBJ_BITMAP). Значение задается в пикселях относительного верхнего левого угла исходного изображения. | int
OBJPROP_YOFFSET | Y-координата левого верхнего угла прямоугольной области видимости в графических объектах "Графическая метка" и "Рисунок" (OBJ_BITMAP_LABEL и OBJ_BITMAP). Значение задается в пикселях относительного верхнего левого угла исходного изображения. | int
OBJPROP_BGCOLOR | Цвет фона для OBJ_EDIT, OBJ_BUTTON, OBJ_RECTANGLE_LABEL | color
OBJPROP_CORNER | Угол графика для привязки графического объекта | ENUM_BASE_CORNER
OBJPROP_BORDER_TYPE | Тип рамки для объекта "Прямоугольная рамка" | ENUM_BORDER_TYPE
OBJPROP_BORDER_COLOR | Цвет рамки для объекта OBJ_EDIT и OBJ_BUTTON | color

Для объектов OBJ_BITMAP_LABEL и OBJ_BITMAP программным путем можно установить специальный режим показа изображения. В этом режиме показывается только та часть исходного изображения, на которую накладывается прямоугольная область видимости, остальная часть картинки становится невидимой. Размеры области видимости необходимо установить с помощью свойств OBJPROP_XSIZE и OBJPROP_YSIZE. Область видимости можно "перемещать" только в пределах исходного изображения с помощью свойств OBJPROP_XOFFSET и OBJPROP_YOFFSET.

Для объектов с фиксированными размерами: OBJ_BUTTON, OBJ_RECTANGLE_LABEL и OBJ_EDIT свойства OBJPROP_XDISTANCE и OBJPROP_YDISTANCE задают положение левой верхней точки объекта относительно угла графика (OBJPROP_CORNER), от которого будут отсчитываться координаты X и Y в пикселях.

Для функций ObjectSetDouble() и ObjectGetDouble()

ENUM_OBJECT_PROPERTY_DOUBLE

Идентификатор | Описание | Тип свойства
OBJPROP_PRICE | Координата цены | double модификатор=номер точки привязки
OBJPROP_LEVELVALUE | Значение уровня | double модификатор=номер уровня
OBJPROP_SCALE | Масштаб (свойство объектов Ганна, "Эллипс" и "Дуги Фибоначчи") | double
OBJPROP_ANGLE | Угол. Для объектов с еще не заданным углом, созданных из программы, значение равно EMPTY_VALUE | double
OBJPROP_DEVIATION | Отклонение для канала стандартного отклонения | double

Для функций ObjectSetString() и ObjectGetString()

ENUM_OBJECT_PROPERTY_STRING

Идентификатор | Описание | Тип свойства
OBJPROP_NAME | Имя объекта | string
OBJPROP_TEXT | Описание объекта (текст, содержащийся в объекте) | string
OBJPROP_TOOLTIP | Текст всплывающей подсказки. Если свойство не задано, то показывается подсказка, автоматически сформированная терминалом. Можно отключить показ подсказки, установив для нее значение "\n" (перевод строки) | string
OBJPROP_LEVELTEXT | Описание уровня | string модификатор=номер уровня
OBJPROP_FONT | Шрифт | string
OBJPROP_BMPFILE | Имя BMP-файла для объекта "Графическая метка". Смотри также Ресурсы | string модификатор: 0-состояние ON, 1-состояние OFF
OBJPROP_SYMBOL | Символ для объекта "График" | string

Для объекта OBJ_RECTANGLE_LABEL ("Прямоугольная метка") можно задать один из трех видов отображения, которым соответствуют значения из перечисления ENUM_BORDER_TYPE.

ENUM_BORDER_TYPE

Идентификатор | Описание
BORDER_FLAT | Плоский вид
BORDER_RAISED | Выпуклый вид
BORDER_SUNKEN | Вогнутый вид

Для объекта OBJ_EDIT ("Поле ввода") и для функции ChartScreenShot() можно указать тип выравнивания по горизонтали с помощью значений перечисления ENUM_ALIGN_MODE.

ENUM_ALIGN_MODE

Идентификатор | Описание
ALIGN_LEFT | Выравнивание по левой границе
ALIGN_CENTER | Выравнивание по центру (только для объекта "Поле ввода")
ALIGN_RIGHT | Выравнивание по правой границе

Пример:

#define UP "\x0431"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
string label_name="my_OBJ_LABEL_object";
if(ObjectFind(0,label_name)<0)
{
Print("Object ",label_name," not found. Error code = ",GetLastError());
//--- создадим объект Label
ObjectCreate(0,label_name,OBJ_LABEL,0,0,0);
//--- установим координату X
ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,200);
//--- установим координату Y
ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,300);
//--- зададим цвет текста
ObjectSetInteger(0,label_name,OBJPROP_COLOR,clrWhite);
//--- установим текст для объекта Label
ObjectSetString(0,label_name,OBJPROP_TEXT,UP);
//--- установим шрифт надписи
ObjectSetString(0,label_name,OBJPROP_FONT,"Wingdings");
//--- установим размер шрифта
ObjectSetInteger(0,label_name,OBJPROP_FONTSIZE,10);
//--- повернем на 45 градусов по часовой стрелке
ObjectSetDouble(0,label_name,OBJPROP_ANGLE,-45);
//--- запретим выделение объекта мышкой
ObjectSetInteger(0,label_name,OBJPROP_SELECTABLE,false);
//--- отрисуем на графике
ChartRedraw(0);
}
}


Способы привязки объектов

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Способы привязки объектов

Способы привязки объектов

Графические объекты Text, Label, Bitmap и Bitmap Label (OBJ_TEXT, OBJ_LABEL, OBJ_BITMAP и OBJ_BITMAP_LABEL) могут иметь один из 9 различных способов привязки своих координат, задаваемых свойством OBJPROP_ANCHOR.

Объект | Идентификатор | X/Y | Width/Height | Date/Price | OBJPROP_CORNER | OBJPROP_ANCHOR | OBJPROP_ANGLE
Text | OBJ_TEXT | — | — | Да | — | Да | Да
Label | OBJ_LABEL | Да | Да (только для чтения) | — | Да | Да | Да
Button | OBJ_BUTTON | Да | Да | — | Да | — | —
Bitmap | OBJ_BITMAP | — | Да (только для чтения) | Да | — | Да | —
Bitmap Label | OBJ_BITMAP_LABEL | Да | Да (только для чтения) | — | Да | Да | —
Edit | OBJ_EDIT | Да | Да | — | Да | — | —
Rectangle Label | OBJ_RECTANGLE_LABEL | Да | Да | — | Да | — | —

В таблице использованы следующие обозначения:

  • X/Y – координаты точки привязки задаются в пикселях относительно одного из углов графика;
  • Width/Height – объекты имеет ширину и высоту. Если указано "только для чтения", то это означает, что значения ширины и высоты вычисляются только после отрисовки объекта на графике;
  • Date/Price – координаты точки привязки задаются парой дата/цена;
  • OBJPROP_CORNER – задаёт угол графика, относительно которого указываются координаты точки привязки. Может быть одним из 4-х значений перечисления ENUM_BASE_CORNER;
  • OBJPROP_ANCHOR – задаёт положение точки привязки в самом объекте, и может быть одним из 9-ти значений перечисления ENUM_ANCHOR_POINT. Именно от этой точки до выбранного угла графика указываются координаты в пикселях;
  • OBJPROP_ANGLE – задаёт угол поворота объекта против часовой стрелки.

Указать нужный вариант можно с помощью функции ObjectSetInteger(handle_графика, имя_объекта, OBJPROP_ANCHOR, способ_привязки), где способ_привязки – одно из значений перечисления ENUM_ANCHOR_POINT.

ENUM_ANCHOR_POINT

Идентификатор | Описание
ANCHOR_LEFT_UPPER | Точка привязки в левом верхнем углу
ANCHOR_LEFT | Точка привязки слева по центру
ANCHOR_LEFT_LOWER | Точка привязки в левом нижнем углу
ANCHOR_LOWER | Точка привязки снизу по центру
ANCHOR_RIGHT_LOWER | Точка привязки в правом нижнем углу
ANCHOR_RIGHT | Точка привязки справа по центру
ANCHOR_RIGHT_UPPER | Точка привязки в правом верхнем углу
ANCHOR_UPPER | Точка привязки сверху по центру
ANCHOR_CENTER | Точка привязки строго по центру объекта

Объекты OBJ_BUTTON, OBJ_RECTANGLE_LABEL и OBJ_EDIT имеют фиксированную точку привязки в левом верхнем углу (ANCHOR_LEFT_UPPER).

Пример:

void OnStart()
{
string text_name="my_OBJ_TEXT_object";
if(ObjectFind(0,text_name)<0)
{
Print("Object ",text_name," not found. Error code = ",GetLastError());
//--- получим максимальную цену графика
double chart_max_price=ChartGetDouble(0,CHART_PRICE_MAX,0);
//--- создадим объект Label
ObjectCreate(0,text_name,OBJ_TEXT,0,TimeCurrent(),chart_max_price);
//--- зададим цвет текста
ObjectSetInteger(0,text_name,OBJPROP_COLOR,clrWhite);
//--- зададим цвет фона
ObjectSetInteger(0,text_name,OBJPROP_BGCOLOR,clrGreen);
//--- установим текст для объекта Label
ObjectSetString(0,text_name,OBJPROP_TEXT,TimeToString(TimeCurrent()));
//--- установим шрифт надписи
ObjectSetString(0,text_name,OBJPROP_FONT,"Trebuchet MS");
//--- установим размер шрифта
ObjectSetInteger(0,text_name,OBJPROP_FONTSIZE,10);
//--- установим привязку к правому верхнему углу
ObjectSetInteger(0,text_name,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
//--- повернем на 90 градусов против часовой стрелке
ObjectSetDouble(0,text_name,OBJPROP_ANGLE,90);
//--- запретим выделение объекта мышкой
ObjectSetInteger(0,text_name,OBJPROP_SELECTABLE,false);
//--- отрисуем на графике
ChartRedraw(0);
}
}

Графические объекты Arrow (OBJ_ARROW) имеют только 2 способа привязки своих координат. Идентификаторы перечислены в ENUM_ARROW_ANCHOR.

ENUM_ARROW_ANCHOR

Идентификатор | Описание
ANCHOR_TOP | Точка привязки для стрелки находится сверху
ANCHOR_BOTTOM | Точка привязки для стрелки находится внизу

Пример:

#property strict
void OnStart()
{
//--- служебные массивы
double Ups[],Downs[];
datetime Times[];
//--- установим для массивов признак таймсерии
ArraySetAsSeries(Ups,true);
ArraySetAsSeries(Downs,true);
ArraySetAsSeries(Times,true);
//--- сбросим код ошибки
ResetLastError();
//--- скопируем таймсерию,содержащую время открытия последних 1000 баров
int copied=CopyTime(NULL,0,0,1000,Times);
if(copied<=0)
{
Print("Не удалось скопировать времена открытия за последние 1000 баров");
return;
}
//--- подготовим массивы Ups и Downs
ArrayResize(Ups,copied);
ArrayResize(Downs,copied);
//--- скопируем значения индикатора iFractals
for(int i=0;i<copied;i++)
{
Ups[i]=iFractals(NULL,0,MODE_UPPER,i);
Downs[i]=iFractals(NULL,0,MODE_LOWER,i);
}
//---
int upcounter=0,downcounter=0; // будем в них подсчитывать количество стрелок
bool created;// будем получать результат попытки создания объекта
for(int i=2;i<copied;i++)// пробежимся по значениям индикатора iFractals
{
if(Ups[i]!=0)// нашли верхний фрактал
{
if(upcounter<10)// создаем не более 10 объектов "вверх"
{
//--- попробуем создать объект "вверх"
created=ObjectCreate(0,string(Times[i]),OBJ_ARROW_THUMB_UP,0,Times[i],Ups[i]);
if(created)// если создался - сделаем ему тюнинг
{
//--- точка привязки снизу, чтобы не наезжать на бар
ObjectSetInteger(0,string(Times[i]),OBJPROP_ANCHOR,ANCHOR_BOTTOM);
//--- последний штрих - покрасим
ObjectSetInteger(0,string(Times[i]),OBJPROP_COLOR,clrBlue);
upcounter++;
}
}
}
if(Downs[i]!=0)// нашли нижний фрактал
{
if(downcounter<10)// создаем не более 10 объектов "вниз"
{
//--- попробуем создать объект "вниз"
created=ObjectCreate(0,string(Times[i]),OBJ_ARROW_THUMB_DOWN,0,Times[i],Downs[i]);
if(created)// если создался - сделаем ему тюнинг
{
//--- точка привязки сверху, чтобы не наезжать на бар
ObjectSetInteger(0,string(Times[i]),OBJPROP_ANCHOR,ANCHOR_TOP);
//--- последний штрих - покрасим
ObjectSetInteger(0,string(Times[i]),OBJPROP_COLOR,clrRed);
downcounter++;
}
}
}
}
}

После выполнения скрипта график будет выглядеть примерно как на этом рисунке.

Установка значков по значениям фракталов


Угол привязки

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Угол привязки

Угол графика, к которому привязан объект

Существует ряд графических объектов, для которых можно задавать угол графика, относительно которого указываются координаты в пикселях. Это следующие типы объектов (в скобках указаны идентификаторы типа объекта):

  • Label (OBJ_LABEL); Текстовая метка
  • Button (OBJ_BUTTON); Кнопка
  • Bitmap Label (OBJ_BITMAP_LABEL); Графическая метка
  • Edit (OBJ_EDIT); Поле ввода
  • Rectangle Label (OBJ_RECTANGLE_LABEL). Прямоугольная метка
Объект | Идентификатор | X/Y | Width/Height | Date/Price | OBJPROP_CORNER | OBJPROP_ANCHOR | OBJPROP_ANGLE
Text | OBJ_TEXT | — | — | Да | — | Да | Да
Label | OBJ_LABEL | Да | Да (только для чтения) | — | Да | Да | Да
Button | OBJ_BUTTON | Да | Да | — | Да | — | —
Bitmap | OBJ_BITMAP | — | Да (только для чтения) | Да | — | Да | —
Bitmap Label | OBJ_BITMAP_LABEL | Да | Да (только для чтения) | — | Да | Да | —
Edit | OBJ_EDIT | Да | Да | — | Да | — | —
Rectangle Label | OBJ_RECTANGLE_LABEL | Да | Да | — | Да | — | —

В таблице использованы следующие обозначения:

  • X/Y – координаты точки привязки задаются в пикселях относительно одного из углов графика;
  • Width/Height – объекты имеет ширину и высоту. Если указано "только для чтения", то это означает, что значения ширины и высоты вычисляются только после отрисовки объекта на графике;
  • Date/Price – координаты точки привязки задаются парой дата/цена;
  • OBJPROP_CORNER – задаёт угол графика, относительно которого указываются координаты точки привязки. Может быть одним из 4-х значений перечисления ENUM_BASE_CORNER;
  • OBJPROP_ANCHOR – задаёт положение точки привязки в самом объекте, и может быть одним из 9-ти значений перечисления ENUM_ANCHOR_POINT. Именно от этой точки до выбранного угла графика указываются координаты в пикселях;
  • OBJPROP_ANGLE – задаёт угол поворота объекта против часовой стрелки.

Для того чтобы указать угол графика, от которого будут отсчитываться координаты X и Y в пикселях, необходимо воспользоваться функцией ObjectSetInteger(chartID, name, OBJPROP_CORNER, chart_corner), где:

  • chartID - идентификатор графика;
  • name – имя графического объекта;
  • OBJPROP_CORNER – идентификатор свойства для задания угла привязки;
  • chart_corner – требуемый угол графика, может принимать одно из значений перечисления ENUM_BASE_CORNER.

ENUM_BASE_CORNER

Идентификатор | Описание
CORNER_LEFT_UPPER | Центр координат в левом верхнем углу графика
CORNER_LEFT_LOWER | Центр координат в левом нижнем углу графика
CORNER_RIGHT_LOWER | Центр координат в правом нижнем углу графика
CORNER_RIGHT_UPPER | Центр координат в правом верхнем углу графика

Пример:

void CreateLabel(long chart_id,
string name,
int chart_corner,
int anchor_point,
string text_label,
int x_ord,
int y_ord)
{
//---
if(ObjectCreate(chart_id,name,OBJ_LABEL,0,0,0))
{
ObjectSetInteger(chart_id,name,OBJPROP_CORNER,chart_corner);
ObjectSetInteger(chart_id,name,OBJPROP_ANCHOR,anchor_point);
ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x_ord);
ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y_ord);
ObjectSetString(chart_id,name,OBJPROP_TEXT,text_label);
}
else
Print("Не удалось создать объект OBJ_LABEL ",name,", Код ошибки =", GetLastError());
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int height=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);
int width=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);
string arrows[4]={"LEFT_UPPER","RIGHT_UPPER","RIGHT_LOWER","LEFT_LOWER"};
CreateLabel(0,arrows[0],CORNER_LEFT_UPPER,ANCHOR_LEFT_UPPER,arrows[0],50,50);
CreateLabel(0,arrows[1],CORNER_RIGHT_UPPER,ANCHOR_RIGHT_UPPER,arrows[1],50,50);
CreateLabel(0,arrows[2],CORNER_RIGHT_LOWER,ANCHOR_RIGHT_LOWER,arrows[2],50,50);
CreateLabel(0,arrows[3],CORNER_LEFT_LOWER,ANCHOR_LEFT_LOWER,arrows[3],50,50);
}


Видимость объектов

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Видимость объектов

Видимость объектов

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

Для установки/получения значения свойства OBJPROP_TIMEFRAMES можно использовать функции ObjectSet()/ObjectGet() или функции ObjectSetInteger()/ObjectGetInteger().

Константа | Значение | Описание
OBJ_NO_PERIODS, EMPTY | -1 | Объект не показывается ни на одном таймфрейме
OBJ_PERIOD_M1 | 0x0001 | Объект рисуется только на 1-минутных графиках
OBJ_PERIOD_M5 | 0x0002 | Объект рисуется только на 5-минутных графиках
OBJ_PERIOD_M15 | 0x0004 | Объект рисуется только на 15-минутных графиках
OBJ_PERIOD_M30 | 0x0008 | Объект рисуется только на 30-минутных графиках
OBJ_PERIOD_H1 | 0x0010 | Объект рисуется только на 1-часовых графиках
OBJ_PERIOD_H4 | 0x0020 | Объект рисуется только на 4-часовых графиках
OBJ_PERIOD_D1 | 0x0040 | Объект рисуется только на дневных графиках
OBJ_PERIOD_W1 | 0x0080 | Объект рисуется только на недельных графиках
OBJ_PERIOD_MN1 | 0x0100 | Объект рисуется только на месячных графиках
OBJ_ALL_PERIODS | 0x01ff | Объект рисуется на всех таймфреймах

Флаги видимости можно комбинировать с помощью символа "|", например, комбинация флагов OBJ_PERIOD_M15|OBJ_PERIOD_H1 означает, что объект будет видим на 15-минутном и часовом таймфреймах.

Пример:

void OnStart()
{
//---
string highlevel="PreviousDayHigh";
string lowlevel="PreviousDayLow";
double prevHigh; // High предыдущего дня
double prevLow; // Low предыдущего дня
double highs[],lows[]; // массивы для получения High и Low

//--- сбросим значение последней ошибки
ResetLastError();
//--- получим 2 последних значения High на дневном таймфрейме
int highsgot=CopyHigh(Symbol(),PERIOD_D1,0,2,highs);
if(highsgot>0) // если копирование прошло успешно
{
Print("Цены High за последние 2 дня получены успешно");
prevHigh=highs[0]; // High предыдущего дня
Print("prevHigh = ",prevHigh);
if(ObjectFind(0,highlevel)<0) // объект с именем highlevel не найден
{
ObjectCreate(0,highlevel,OBJ_HLINE,0,0,0); // создадим объект гор. линия
}
//--- зададим ценовой уровень для линии highlevel
ObjectSetDouble(0,highlevel,OBJPROP_PRICE,0,prevHigh);
//--- установим видимость только для PERIOD_M15 и PERIOD_H1
ObjectSetInteger(0,highlevel,OBJPROP_TIMEFRAMES,OBJ_PERIOD_M15|OBJ_PERIOD_H1);
}
else
{
Print("Не удалось получить цены High за последние 2 дня, Error = ",GetLastError());
}

//--- сбросим значение последней ошибки
ResetLastError();
//--- получим 2 последних значения Low на дневном таймфрейме
int lowsgot=CopyLow(Symbol(),PERIOD_D1,0,2,lows);
if(lowsgot>0) // если копирование прошло успешно
{
Print("Цены Low за последние 2 дня получены успешно");
prevLow=lows[0]; // Low предыдущего дня
Print("prevLow = ",prevLow);
if(ObjectFind(0,lowlevel)<0) // объект с именем lowlevel не найден
{
ObjectCreate(0,lowlevel,OBJ_HLINE,0,0,0); // создадим объект гор. линия
}
//--- зададим ценовой уровень для линии lowlevel
ObjectSetDouble(0,lowlevel,OBJPROP_PRICE,0,prevLow);
//--- установим видимость только для PERIOD_M15 и PERIOD_H1
ObjectSetInteger(0,lowlevel,OBJPROP_TIMEFRAMES,OBJ_PERIOD_M15|OBJ_PERIOD_H1);
}
else Print("Не удалось получить цены Low за последние 2 дня, Error = ",GetLastError());

ChartRedraw(0); // перерисуем график принудительно
}

Смотри также

PeriodSeconds, Period, Периоды графиков, Дата и время


Объекты Ганна

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Объекты Ганна

Объекты Ганна

Для объектов веер Ганна (OBJ_GANNFAN) и сетка Ганна (OBJ_GANNGRID) можно указать одно из двух значений перечисления ENUM_GANN_DIRECTION, которое задает направление тренда.

ENUM_GANN_DIRECTION

Константа | Описание
GANN_UP_TREND | Линия соответствует восходящему тренду
GANN_DOWN_TREND | Линия соответствует нисходящему тренду

Для установки масштаба основной линии 1x1 используется функция ObjectSetDouble(chart_handle, gann_object_name, OBJPROP_SCALE, scale), где:

  • chart_handle – окно графика, в котором находится объект;
  • gann_object_name – имя объекта;
  • OBJPROP_SCALE – идентификатор свойства "Scale";
  • scale – требуемый масштаб в единицах Pips/Bar.

Параметры объекта веер Ганна

Пример создания веера Ганна:

void OnStart()
{
//---
string my_gann="OBJ_GANNFAN object";
if(ObjectFind(0,my_gann)<0)// объект не найден
{
//--- сообщим о неудаче
Print("Object ",my_gann," not found. Error code = ",GetLastError());
//--- получим максимальную цену графика
double chart_max_price=ChartGetDouble(0,CHART_PRICE_MAX,0);
//--- получим минимальную цену графика
double chart_min_price=ChartGetDouble(0,CHART_PRICE_MIN,0);
//--- сколько баров на графике показано?
int bars_on_chart=int(ChartGetInteger(0,CHART_VISIBLE_BARS));
//--- создадим массив, куда запишем время открытия каждого бара
datetime Times[];
//--- организуем доступ к массиву как в таймсерии
ArraySetAsSeries(Times,true);
//--- теперь скопируем в него данные для видимых на графике баров
int times=CopyTime(NULL,0,0,bars_on_chart,Times);
if(times<=0)
{
Print("Не удалось скопировать массив со временем открытия!");
return;
}
//--- предварительные приготовления закончены

//--- индекс центрального бара на графике
int center_bar=bars_on_chart/2;
//--- экватор графика - между максимумом и минимумом
double mean=(chart_max_price+chart_min_price)/2.0;
//--- установим координаты первой точки привязки в центр
ObjectCreate(0,my_gann,OBJ_GANNFAN,0,Times[center_bar],mean,
//--- вторая точки привязки справа
Times[center_bar/2],(mean+chart_min_price)/2.0);
Print("Times[center_bar] = "+(string)Times[center_bar]+" Times[center_bar/2] = "+(string)Times[center_bar/2]);
//Print("Times[center_bar]/="+Times[center_bar]+" Times[center_bar/2]="+Times[center_bar/2]);
//--- установим масштаб в единицах Pips/Bar
ObjectSetDouble(0,my_gann,OBJPROP_SCALE,10);
//--- установим направление тренда
ObjectSetInteger(0,my_gann,OBJPROP_DIRECTION,GANN_UP_TREND);
//--- установим толщину линий
ObjectSetInteger(0,my_gann,OBJPROP_WIDTH,1);
//--- зададим стиль линий
ObjectSetInteger(0,my_gann,OBJPROP_STYLE,STYLE_DASHDOT);
//--- и цвет линий
ObjectSetInteger(0,my_gann,OBJPROP_COLOR,clrYellowGreen);
//--- разрешим пользователю выделять объект
ObjectSetInteger(0,my_gann,OBJPROP_SELECTABLE,true);
//--- выделим его сами
ObjectSetInteger(0,my_gann,OBJPROP_SELECTED,true);
//--- отрисуем на графике
ChartRedraw(0);
}
}


Набор Web-цветов

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Набор Web-цветов

Набор Web-цветов

Для типа color определены следующие цветовые константы:

clrBlack | clrDarkGreen | clrDarkSlateGray | clrOlive | clrGreen | clrTeal | clrNavy | clrPurple
clrMaroon | clrIndigo | clrMidnightBlue | clrDarkBlue | clrDarkOliveGreen | clrSaddleBrown | clrForestGreen | clrOliveDrab
clrSeaGreen | clrDarkGoldenrod | clrDarkSlateBlue | clrSienna | clrMediumBlue | clrBrown | clrDarkTurquoise | clrDimGray
clrLightSeaGreen | clrDarkViolet | clrFireBrick | clrMediumVioletRed | clrMediumSeaGreen | clrChocolate | clrCrimson | clrSteelBlue
clrGoldenrod | clrMediumSpringGreen | clrLawnGreen | clrCadetBlue | clrDarkOrchid | clrYellowGreen | clrLimeGreen | clrOrangeRed
clrDarkOrange | clrOrange | clrGold | clrYellow | clrChartreuse | clrLime | clrSpringGreen | clrAqua
clrDeepSkyBlue | clrBlue | clrMagenta | clrRed | clrGray | clrSlateGray | clrPeru | clrBlueViolet
clrLightSlateGray | clrDeepPink | clrMediumTurquoise | clrDodgerBlue | clrTurquoise | clrRoyalBlue | clrSlateBlue | clrDarkKhaki
clrIndianRed | clrMediumOrchid | clrGreenYellow | clrMediumAquamarine | clrDarkSeaGreen | clrTomato | clrRosyBrown | clrOrchid
clrMediumPurple | clrPaleVioletRed | clrCoral | clrCornflowerBlue | clrDarkGray | clrSandyBrown | clrMediumSlateBlue | clrTan
clrDarkSalmon | clrBurlyWood | clrHotPink | clrSalmon | clrViolet | clrLightCoral | clrSkyBlue | clrLightSalmon
clrPlum | clrKhaki | clrLightGreen | clrAquamarine | clrSilver | clrLightSkyBlue | clrLightSteelBlue | clrLightBlue
clrPaleGreen | clrThistle | clrPowderBlue | clrPaleGoldenrod | clrPaleTurquoise | clrLightGray | clrWheat | clrNavajoWhite
clrMoccasin | clrLightPink | clrGainsboro | clrPeachPuff | clrPink | clrBisque | clrLightGoldenrod | clrBlanchedAlmond
clrLemonChiffon | clrBeige | clrAntiqueWhite | clrPapayaWhip | clrCornsilk | clrLightYellow | clrLightCyan | clrLinen
clrLavender | clrMistyRose | clrOldLace | clrWhiteSmoke | clrSeashell | clrIvory | clrHoneydew | clrAliceBlue
clrLavenderBlush | clrMintCream | clrSnow | clrWhite |  |  |  |

Задавать цвет можно для объектов с помощью функции ObjectSetInteger(). Для получения значения цвета служат аналогичная функция ObjectGetInteger().

Пример:

//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
#property indicator_type3 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_color2 clrRed
#property indicator_color3 clrLime


Wingdings

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Wingdings

Wingdings

Символы шрифта Wingdings, используемые с объектом OBJ_ARROW:

Таблица символов шрифта Wingdings

Установка нужного символа производится с помощью функции ObjectSetInteger().

Пример:

void OnStart()
{
//---
string up_arrow="up_arrow";
datetime time=TimeCurrent();
double lastClose[1];
int close=CopyClose(Symbol(),Period(),0,1,lastClose); // получим цену Close
//--- если цена получена
if(close>0)
{
ObjectCreate(0,up_arrow,OBJ_ARROW,0,0,0,0,0); // создадим стрелку
ObjectSetInteger(0,up_arrow,OBJPROP_ARROWCODE,241); // установим код стрелки
ObjectSetInteger(0,up_arrow,OBJPROP_TIME,time); // зададим время
ObjectSetDouble(0,up_arrow,OBJPROP_PRICE,lastClose[0]);// зададим цену
ChartRedraw(0); // перерисуем окно
}
else
Print("Не удалось получить последнюю цену Close!");
}


Коды стрелок

Справочник MQL4 / Константы, перечисления и структуры / Константы объектов / Коды стрелок

Коды стрелок

Константы кодов стрелок. Mогут иметь следующие значения:

Константа | Значение | Описание
SYMBOL_THUMBSUP | 67 | Символ - большой палец вверх
SYMBOL_THUMBSDOWN | 68 | Символ - большой палец вниз
SYMBOL_ARROWUP | 241 | Символ - стрелка вверх
SYMBOL_ARROWDOWN | 242 | Символ - стрелка вниз
SYMBOL_STOPSIGN | 251 | Символ - СТОП
SYMBOL_CHECKSIGN | 252 | Символ - галочка

Специальные коды стрелок, которые точно указывают на цену и время. Mогут быть следующими величинами:

Константа | Значение | Описание
 | 1 | Восходящая стрелка с подсказкой направо
 | 2 | Нисходящая стрелка с подсказкой направо
 | 3 | Треугольник указывающий налево
 | 4 | Символ черточки
SYMBOL_LEFTPRICE | 5 | Левая ценовая метка
SYMBOL_RIGHTPRICE | 6 | Правая ценовая метка

Специальные коды стрелок не могут использоваться в пользовательских индикаторах при установке значения стрелки для линий, имеющих стиль DRAW_ARROW.

Пример:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Lime
//---- input parameters
extern double Step=0.02;
extern double Maximum=0.2;
//---- buffers
double SarBuffer[];
//----
int save_lastreverse;
bool save_dirlong;
double save_start;
double save_last_high;
double save_last_low;
double save_ep;
double save_sar;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,159);
SetIndexBuffer(0,SarBuffer);
//----
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| SaveLastReverse |
//+------------------------------------------------------------------+
void SaveLastReverse(int last,int dir,double start_index,double low,double high,double ep,double sar)
{
save_lastreverse=last;
save_dirlong=dir;
save_start=start_index;
save_last_low=low;
save_last_high=high;
save_ep=ep;
save_sar=sar;
}
//+------------------------------------------------------------------+
//| Parabolic Sell And Reverse system |
//+------------------------------------------------------------------+
int start()
{
static bool first=true;
bool dirlong;
double start_index,last_high,last_low;
double ep,sar,price_low,price_high,price;
int i;
int limit,cb;
//----
if(Bars<3) return(0);
int counted_bars=IndicatorCounted();
if(counted_bars < 0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
if(counted_bars==0) limit-=2;

//---- initial settings
i=limit;
if(counted_bars==0 || first)
{
first=false;
dirlong=true;
start_index=Step;
last_high=-10000000.0;
last_low=10000000.0;
while(i>0)
{
save_lastreverse=i;
price_low=Low[i];
if(last_low>price_low) last_low=price_low;
price_high=High[i];
if(last_high<price_high) last_high=price_high;
if(price_high>High[i+1] && price_low>Low[i+1]) break;
if(price_high<High[i+1] && price_low<Low[i+1]) { dirlong=false; break; }
i--;
}
//---- initial zero
int k=i;
while(k<Bars)
{
SarBuffer[k]=0.0;
k++;
}
//---- check further
if(dirlong) { SarBuffer[i]=Low[i+1]; ep=High[i]; }
else { SarBuffer[i]=High[i+1]; ep=Low[i]; }
i--;
}
else
{
i=save_lastreverse;
start_index=save_start;
dirlong=save_dirlong;
last_high=save_last_high;
last_low=save_last_low;
ep=save_ep;
sar=save_sar;
}
//----
while(i>=0)
{
price_low=Low[i];
price_high=High[i];
//--- check for reverse
if(dirlong && price_low<SarBuffer[i+1])
{
SaveLastReverse(i,true,start_index,price_low,last_high,ep,sar);
start_index=Step; dirlong=false;
ep=price_low; last_low=price_low;
SarBuffer[i]=last_high;
i--;
continue;
}
if(!dirlong && price_high>SarBuffer[i+1])
{
SaveLastReverse(i,false,start_index,last_low,price_high,ep,sar);
start_index=Step; dirlong=true;
ep=price_high; last_high=price_high;
SarBuffer[i]=last_low;
i--;
continue;
}
//---
price=SarBuffer[i+1];
sar=price+start_index*(ep-price);
if(dirlong)
{
if(ep<price_high && (start_index+Step)<=Maximum) start_index+=Step;
if(price_high<High[i+1] && i==Bars-2) sar=SarBuffer[i+1];

price=Low[i+1];
if(sar>price) sar=price;
price=Low[i+2];
if(sar>price) sar=price;
if(sar>price_low)
{
SaveLastReverse(i,true,start_index,price_low,last_high,ep,sar);
start_index=Step; dirlong=false; ep=price_low;
last_low=price_low;
SarBuffer[i]=last_high;
i--;
continue;
}
if(ep<price_high) { last_high=price_high; ep=price_high; }
}
else
{
if(ep>price_low && (start_index+Step)<=Maximum) start_index+=Step;
if(price_low<Low[i+1] && i==Bars-2) sar=SarBuffer[i+1];

price=High[i+1];
if(sar<price) sar=price;
price=High[i+2];
if(sar<price) sar=price;
if(sar<price_high)
{
SaveLastReverse(i,false,start_index,last_low,price_high,ep,sar);
start_index=Step; dirlong=true; ep=price_high;
last_high=price_high;
SarBuffer[i]=last_low;
i--;
continue;
}
if(ep>price_low) { last_low=price_low; ep=price_low; }
}
SarBuffer[i]=sar;
i--;
}
//---
for(cb=limit;cb>=0;cb--)
{
if(GreaterDoubles(SarBuffer[cb],0,Digits))
{
string object_name="price"+string(Time[cb]);
//--- сначала ищем по имени объект
if(ObjectFind(object_name)<0)
{
//--- если нет, создаем
if(ObjectCreate(object_name,OBJ_ARROW,0,Time[cb],SarBuffer[cb]))
{
//--- устанавливаем свойства объекта
//--- код стрелки
ObjectSet(object_name,OBJPROP_ARROWCODE,SYMBOL_LEFTPRICE);
//--- цвет
ObjectSet(object_name,OBJPROP_COLOR,DodgerBlue);
//--- цену
ObjectSet(object_name,OBJPROP_PRICE1,SarBuffer[cb]);
//--- время
ObjectSet(object_name,OBJPROP_TIME1,Time[cb]);
}
}
else
{
//--- если объект существует, просто меняем значение координаты цены
ObjectSet(object_name,OBJPROP_PRICE1,SarBuffer[cb]);
}
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| GreaterDoubles |
//+------------------------------------------------------------------+
bool GreaterDoubles(double number1,double number2,int dig)
{
if(NormalizeDouble(number1-number2,dig)>0) return(true);
else return(false);
}
//+------------------------------------------------------------------+


Константы индикаторов

Справочник MQL4 / Константы, перечисления и структуры / Константы индикаторов

Константы индикаторов

Предопределены 29 стандартных технических индикаторов, которые можно использовать в программах на языке MQL4. Кроме того, есть возможность создавать свои собственные пользовательские индикаторы с помощью функции iCustom(). Все необходимые для этого константы разделены на 5 групп:

  • Ценовые константы – для выбора типа цены или объема, по которым считается индикатор;
  • Идентификаторы таймсерий - для выбора типа значений из таймсерии;
  • Методы скользящих – встроенные методы сглаживания, используемые в индикаторах;
  • Линии индикаторов – идентификаторы индикаторных буферов при доступе к значениям индикаторов;
  • Стили рисования – для указания одного из 6 видов отрисовки и задания стиля рисования линии;
  • Свойства пользовательских индикаторов – используются в функциях для работы с пользовательскими индикаторами;

Что нового в MQL5

В MQL5 количество встроенных технических индикаторов увеличено с 30 до 38, а количество стилей рисования пользовательских индикаторов выросло в 3 раза – с 6 до 18. Теперь пользовательский индикатор может использовать до 512 индикаторных буферов, при этом для цветных стилей можно задать свой цвет отрисовки на каждом баре.

Стиль | Описание | Буферов значений | Буферов цвета
DRAW_NONE | На графике визуально не отображается, но значения соответствующего буфера можно посмотреть в "Окне данных" | 1 | -
DRAW_LINE | Строится линия по значениям соответствующего буфера (пустые значения в буфере нежелательны) | 1 | -
DRAW_SECTION | Рисуется отрезками между значениями соответствующего буфера (обычно пустых значений много) | 1 | -
DRAW_HISTOGRAM | Рисуется гистограммой от нулевой линии до значений соответствующего буфера (допускаются пустые значения) | 1 | -
DRAW_HISTOGRAM2 | Рисуется гистограммой на двух индикаторных буферах (допускаются пустые значения) | 2 | -
DRAW_ARROW | Отображается символами (допускаются пустые значения) | 1 | -
DRAW_ZIGZAG | Похож на стиль DRAW_SECTION, но в отличие от него может строить вертикальные отрезки на одном баре | 2 | -
DRAW_FILLING | Цветовая заливка между двумя линиями. В "Окне данных" показываются 2 значения соответствующих буферов | 2 | -
DRAW_BARS | Отображение на графике в виде баров. В "Окне данных" показываются 4 значения соответствующих буферов | 4 | -
DRAW_CANDLES | Отображение в виде японских свечей. В "Окне данных" показываются 4 значения соответствующих буферов | 4 | -
DRAW_COLOR_LINE | Линия, для которой можно чередовать цвет как на разных барах, так и сменить ее цвет в любой момент времени | 1 | 1
DRAW_COLOR_SECTION | Похож на стиль DRAW_SECTION, но цвет каждой секции можно задавать индивидуально, можно задавать цвет динамически | 1 | 1
DRAW_COLOR_HISTOGRAM | Похож на стиль DRAW_HISTOGRAM, но каждая полоска может иметь свой цвет, можно задавать цвет динамически | 1 | 1
DRAW_COLOR_HISTOGRAM2 | Похож на DRAW_HISTOGRAM2, но каждая полоска может иметь свой цвет, цвет можно задавать динамически | 2 | 1
DRAW_COLOR_ARROW | Похож на стиль DRAW_ARROW, но каждый символ может иметь свой цвет. Цвет можно менять динамически | 1 | 1
DRAW_COLOR_ZIGZAG | Стиль DRAW_ZIGZAG с возможностями индивидуальной раскраски секций и динамической смены цвета | 2 | 1
DRAW_COLOR_BARS | Стиль DRAW_BARS с возможностями индивидуальной раскраски баров и динамической смены цвета | 4 | 1
DRAW_COLOR_CANDLES | Стиль DRAW_CANDLES с возможностями индивидуальной раскраски свечей и динамической смены цвета | 4 | 1


Ценовые константы

Справочник MQL4 / Константы, перечисления и структуры / Константы индикаторов / Ценовые константы

Ценовые константы

Технические индикаторы требуют для своих расчетов указания значений цен и/или значений объемов, на которых они будут считаться. Существуют 7 предопределенных идентификаторов перечисления ENUM_APPLIED_PRICE, для указания нужной ценовой базы расчетов.

Используемая цена для расчета индикаторов может принимать любое из следующих значений:

ENUM_APPLIED_PRICE

Константа | Значение | Описание
PRICE_CLOSE | 0 | Цена закрытия
PRICE_OPEN | 1 | Цена открытия
PRICE_HIGH | 2 | Максимальная за период цена
PRICE_LOW | 3 | Минимальная за период цена
PRICE_MEDIAN | 4 | Медианная цена, (high+low)/2
PRICE_TYPICAL | 5 | Типичная цена, (high+low+close)/3
PRICE_WEIGHTED | 6 | Взвешенная цена закрытия, (high+low+close+close)/4

Технический индикатор iStochastic() имеет два варианта расчета, которые могут использовать:

  • либо только цены Close;
  • либо цены High и Low.

Для выбора нужного варианта расчета нужно указать одно из значений перечисления ENUM_STO_PRICE.

ENUM_STO_PRICE

Идентификатор | Описание
STO_LOWHIGH | Построение по ценам Low/High
STO_CLOSECLOSE | Построение по ценам Close/Close


Идентификаторы таймсерий

Справочник MQL4 / Константы, перечисления и структуры / Константы индикаторов / Идентификаторы таймсерий

Идентификаторы таймсерий

Идентификаторы таймсерий используются в функциях ArrayCopySeries(), iHighest() и iLowest(). Mогут быть одной из следующих величин:

Константа | Значение | Описание
MODE_OPEN | 0 | Цена открытия
MODE_LOW | 1 | Минимальная цена
MODE_HIGH | 2 | Максимальная цена
MODE_CLOSE | 3 | Цена закрытия
MODE_VOLUME | 4 | Объем (количество тиков, сформировавших бар), используется в функциях iLowest() и iHighest()
MODE_TIME | 5 | Время открытия бара, используется в функции ArrayCopySeries()


Методы скользящих

Справочник MQL4 / Константы, перечисления и структуры / Константы индикаторов / Методы скользящих

Методы скользящих

В основе многих технических индикаторов лежат те или иные методы сглаживания ценовых серий. Некоторые стандартные технические индикаторы (iAlligator(), iEnvelopes(), iEnvelopesOnArray(), iForce(), iGator(), iMA(), iMAOnArray(), iStdDev(), iStdDevOnArray() и iStochastic()) требуют указания типа сглаживания в качестве параметра. Для указания нужного типа сглаживания служат идентификаторы, перечисленные в перечислении ENUM_MA_METHOD.

ENUM_MA_METHOD

Идентификатор | Значение | Описание
MODE_SMA | 0 | Простое усреднение
MODE_EMA | 1 | Экспоненциальное усреднение
MODE_SMMA | 2 | Сглаженное усреднение
MODE_LWMA | 3 | Линейно-взвешенное усреднение


Линии индикаторов

Справочник MQL4 / Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов

Линии индикаторов

Идентификаторы линий индикаторов, используемых при вызове функций iMACD(), iRVI() и iStochastic(). Mогут иметь одно из следующего значений:

Константа | Значение | Описание
MODE_MAIN | 0 | Основная линия
MODE_SIGNAL | 1 | Сигнальная линия

Идентификаторы линий Average Directional Movement Index, используемых при вызове функции iADX():

Константа | Значение | Описание
MODE_MAIN | 0 | Основная линия
MODE_PLUSDI | 1 | Линия +DI
MODE_MINUSDI | 2 | Линия -DI

Идентификаторы линий индикаторов, используемых при вызове функций iBands(), iEnvelopes(), iEnvelopesOnArray(), iFractals() и iGator():

Константа | Значение | Описание
MODE_UPPER | 1 | Верхняя линия
MODE_LOWER | 2 | Нижняя линия

Идентификаторы линий индикаторов, используемых при вызове функций iAlligator() . Могут принимать одно из следующих значений:

Константа | Значение | Описание
MODE_GATORJAW | 1 | Линия Jaw (челюсти Аллигатора)
MODE_GATORTEETH | 2 | Линия Teeth (зубы Аллигатора)
MODE_GATORLIPS | 3 | Линия Lips (губы Аллигатора)

Идентификаторы линий индикатора Ichimoku Kinko Hyo, используемых при вызове функции iIchimoku(). Могут принимать одно из следующих значений:

Константа | Значение | Описание
MODE_TENKANSEN | 1 | Tenkan-sen
MODE_KIJUNSEN | 2 | Kijun-sen
MODE_SENKOUSPANA | 3 | Senkou Span A
MODE_SENKOUSPANB | 4 | Senkou Span B
MODE_CHIKOUSPAN | 5 | Chinkou Span


Стили рисования

Справочник MQL4 / Константы, перечисления и структуры / Константы индикаторов / Стили рисования

Стили рисования

Список стилей рисования для функций SetIndexStyle() и SetLevelStyle().

Константа | Значение | Описание
DRAW_LINE | 0 | Простая линия
DRAW_SECTION | 1 | Отрезки между непустыми значениями линии
DRAW_HISTOGRAM | 2 | Гистограмма
DRAW_ARROW | 3 | Стрелки (символы)
DRAW_ZIGZAG | 4 | Отрезки между непустыми значениями чётной и нечётной линий (зигзаг), 2 буфера значений
DRAW_NONE | 12 | Отсутствие какого-либо рисования

Существуют 5 стилей, которыми может рисоваться линия в пользовательском индикаторе. Они применимы только при толщине линии 0 или 1.

ENUM_LINE_STYLE

Константа | Значение | Описание
STYLE_SOLID | 0 | Сплошная линия
STYLE_DASH | 1 | Штриховая линия
STYLE_DOT | 2 | Пунктирная линия
STYLE_DASHDOT | 3 | Штрих-пунктирная линия
STYLE_DASHDOTDOT | 4 | Штрих-пунктирная линия с двойными точками

Стиль линии может также использоваться для получения или установки свойства OBJPROP_STYLE объекта.

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

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


Свойства пользовательских индикаторов

Справочник MQL4 / Константы, перечисления и структуры / Константы индикаторов / Свойства пользовательских индикаторов

Свойства пользовательских индикаторов

Пользовательский индикатор имеет множество настроек для удобства отображения и восприятия. Эти настройки производятся через задание соответствующих свойств индикатора с помощью функций IndicatorSetDouble(), IndicatorSetInteger() и IndicatorSetString(). Идентификаторы свойств индикатора перечислены в перечислениях ENUM_CUSTOMIND_PROPERTY.

ENUM_CUSTOMIND_PROPERTY_INTEGER

Идентификатор | Описание | Тип свойства
INDICATOR_DIGITS | Точность отображения значений индикатора | int
INDICATOR_HEIGHT | Фиксированная высота собственного окна индикатора (команда препроцессора #property indicator_height) | int
INDICATOR_LEVELS | Количество уровней на окне индикатора | int
INDICATOR_LEVELCOLOR | Цвет линии уровня | color меняет цвет всех уровней
INDICATOR_LEVELSTYLE | Стиль линии уровня | ENUM_LINE_STYLE меняет стиль всех уровней
INDICATOR_LEVELWIDTH | Толщина линии уровня | int меняет толщину всех уровней

ENUM_CUSTOMIND_PROPERTY_DOUBLE

Идентификатор | Описание | Тип свойства
INDICATOR_MINIMUM | Минимум окна индикатора | double
INDICATOR_MAXIMUM | Максимум окна индикатора | double
INDICATOR_LEVELVALUE | Значение уровня | double модификатор=номер уровня

ENUM_CUSTOMIND_PROPERTY_STRING

Идентификатор | Описание | Тип свойства
INDICATOR_SHORTNAME | Короткое наименование индикатора | string
INDICATOR_LEVELTEXT | Описание уровня | string модификатор=номер уровня

Пример:

#property description "Relative Strength Index"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 clrDodgerBlue
//--- входные параметры
input int InpRSIPeriod=14; // RSI Period
//--- массивы индикаторных буферов
double ExtRSIBuffer[];
double ExtPosBuffer[];
double ExtNegBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit(void)
{
string short_name;
//--- два дополнительных буфера используются для вычислений
IndicatorBuffers(3);
SetIndexBuffer(0,ExtRSIBuffer);
SetIndexBuffer(1,ExtPosBuffer);
SetIndexBuffer(2,ExtNegBuffer);
//--- уровни
IndicatorSetInteger(INDICATOR_LEVELS,2);
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,30);
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,70);
//--- максимальные и минимальные значения в подоконе
IndicatorSetDouble(INDICATOR_MINIMUM,0);
IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- отрисовка индикатора в виде линии
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtRSIBuffer);
//--- имя в окне DataWindow и метка
short_name="RSI("+string(InpRSIPeriod)+")";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
//--- проверка входных параметров
if(InpRSIPeriod<2)
{
Print("Неправильное значение переменной InpRSIPeriod = ",InpRSIPeriod);
return(INIT_FAILED);
}
//---
SetIndexDrawBegin(0,InpRSIPeriod);
//--- инициализация успешно завершена
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Relative Strength Index |
//+------------------------------------------------------------------+
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[])
{
int i,pos;
double diff;
//---
if(Bars<=InpRSIPeriod || InpRSIPeriod<2)
return(0);
//--- расчет будет производится от 0 до rates_total
ArraySetAsSeries(ExtRSIBuffer,false);
ArraySetAsSeries(ExtPosBuffer,false);
ArraySetAsSeries(ExtNegBuffer,false);
ArraySetAsSeries(close,false);
//--- предварительные расчеты
pos=prev_calculated-1;
if(pos<=InpRSIPeriod)
{
//--- первые значения RSIPeriod не рассчитываются
ExtRSIBuffer[0]=0.0;
ExtPosBuffer[0]=0.0;
ExtNegBuffer[0]=0.0;
double sump=0.0;
double sumn=0.0;
for(i=1; i<=InpRSIPeriod; i++)
{
ExtRSIBuffer[i]=0.0;
ExtPosBuffer[i]=0.0;
ExtNegBuffer[i]=0.0;
diff=close[i]-close[i-1];
if(diff>0)
sump+=diff;
else
sumn-=diff;
}
//--- расчет первого отображаемого значения
ExtPosBuffer[InpRSIPeriod]=sump/InpRSIPeriod;
ExtNegBuffer[InpRSIPeriod]=sumn/InpRSIPeriod;
if(ExtNegBuffer[InpRSIPeriod]!=0.0)
ExtRSIBuffer[InpRSIPeriod]=100.0-(100.0/(1.0+ExtPosBuffer[InpRSIPeriod]/ExtNegBuffer[InpRSIPeriod]));
else
{
if(ExtPosBuffer[InpRSIPeriod]!=0.0)
ExtRSIBuffer[InpRSIPeriod]=100.0;
else
ExtRSIBuffer[InpRSIPeriod]=50.0;
}
//--- подготовка начальной позиции
pos=InpRSIPeriod+1;
}
//--- главный цикл расчета
for(i=pos; i<rates_total && !IsStopped(); i++)
{
diff=close[i]-close[i-1];
ExtPosBuffer[i]=(ExtPosBuffer[i-1]*(InpRSIPeriod-1)+(diff>0.0?diff:0.0))/InpRSIPeriod;
ExtNegBuffer[i]=(ExtNegBuffer[i-1]*(InpRSIPeriod-1)+(diff<0.0?-diff:0.0))/InpRSIPeriod;
if(ExtNegBuffer[i]!=0.0)
ExtRSIBuffer[i]=100.0-100.0/(1+ExtPosBuffer[i]/ExtNegBuffer[i]);
else
{
if(ExtPosBuffer[i]!=0.0)
ExtRSIBuffer[i]=100.0;
else
ExtRSIBuffer[i]=50.0;
}
}
//---
return(rates_total);
}


Состояние окружения

Справочник MQL4 / Константы, перечисления и структуры / Состояние окружения

Состояние окружения

Константы, описывающие текущую среду выполнения mql4-программы делятся на группы:

  • Состояние клиентского терминала – информация о клиентском терминале;
  • Информация о запущенной MQL4-программе – свойства mql4-программы, которые помогают дополнительно управлять ее поведением;
  • Информация об инструменте – получение торговой информации об инструменте;
  • Информация о счете – информация о текущем торговом счете;
  • Статистика тестирования – результаты тестирования эксперта.


Состояние клиентского терминала

Справочник MQL4 / Константы, перечисления и структуры / Состояние окружения / Состояние клиентского терминала

Состояние клиентского терминала

Идентификаторы для получения информации о клиентском терминале функциями TerminalInfoInteger() и TerminalInfoString(). В качестве параметра эти функции принимают значения из перечислений ENUM_TERMINAL_INFO_INTEGER и ENUM_TERMINAL_INFO_STRING соответственно.

ENUM_TERMINAL_INFO_INTEGER

Идентификатор

Описание

Тип свойства

TERMINAL_BUILD

Номер билда запущенного терминала

int

TERMINAL_COMMUNITY_ACCOUNT

Флаг наличия авторизационных данных MQL5.community в терминале

bool

TERMINAL_COMMUNITY_CONNECTION

Наличие подключения к MQL5.community

bool

TERMINAL_CONNECTED

Наличие подключения к торговому серверу

bool

TERMINAL_DLLS_ALLOWED

Разрешение на использование DLL

bool

TERMINAL_TRADE_ALLOWED

Разрешение на торговлю

bool

TERMINAL_EMAIL_ENABLED

Разрешение на отправку писем с использованием SMTP-сервера и логина,указанных в настройках терминала

bool

TERMINAL_FTP_ENABLED

Разрешение на отправку отчетов по FTP на указанный сервер для указанного в настройках терминала торгового счета

bool

TERMINAL_NOTIFICATIONS_ENABLED

Разрешение на отправку уведомлений на смартфон

bool

TERMINAL_MAXBARS

Максимальное количество баров на графике

int

TERMINAL_MQID

Флаг наличия MetaQuotes ID для отправки Push-уведомлений

bool

TERMINAL_CODEPAGE

Номер кодовой страницы языка, установленного в клиентском терминале

int

TERMINAL_CPU_CORES

Количество процессоров в системе

int

TERMINAL_DISK_SPACE

Объем свободной памяти на диске для папки MQL4\Files терминала, в Mb

int

TERMINAL_MEMORY_PHYSICAL

Размер физической памяти в системе, в Mb

int

TERMINAL_MEMORY_TOTAL

Размер памяти, доступной процессу терминала, в Mb

int

TERMINAL_MEMORY_AVAILABLE

Размер свободной памяти процесса терминала в Mb

int

TERMINAL_MEMORY_USED

Размер памяти, использованной терминалом, в Mb

int

TERMINAL_SCREEN_DPI

Разрешающая способность вывода информации на экран измеряется в количестве точек на линейный дюйм поверхности (DPI).

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

int

TERMINAL_PING_LAST

Последнее известное значение пинга до торгового сервера в микросекундах. В одной секунде миллион микросекунд.

int

Идентификатор клавиши

Описание

TERMINAL_KEYSTATE_LEFT

Состояние клавиши "Стрелка влево"

int

TERMINAL_KEYSTATE_UP

Состояние клавиши "Стрелка вверх"

int

TERMINAL_KEYSTATE_RIGHT

Состояние клавиши "Стрелка вправо"

int

TERMINAL_KEYSTATE_DOWN

Состояние клавиши "Стрелка вниз"

int

TERMINAL_KEYSTATE_SHIFT

Состояние клавиши "Shift"

int

TERMINAL_KEYSTATE_CONTROL

Состояние клавиши "Ctrl"

int

TERMINAL_KEYSTATE_MENU

Состояние клавиши "Windows"

int

TERMINAL_KEYSTATE_CAPSLOCK

Состояние клавиши "CapsLock"

int

TERMINAL_KEYSTATE_NUMLOCK

Состояние клавиши "NumLock"

int

TERMINAL_KEYSTATE_SCRLOCK

Состояние клавиши "ScrollLock"

int

TERMINAL_KEYSTATE_ENTER

Состояние клавиши "Enter"

int

TERMINAL_KEYSTATE_INSERT

Состояние клавиши "Insert"

int

TERMINAL_KEYSTATE_DELETE

Состояние клавиши "Delete"

int

TERMINAL_KEYSTATE_HOME

Состояние клавиши "Home"

int

TERMINAL_KEYSTATE_END

Состояние клавиши "End"

int

TERMINAL_KEYSTATE_TAB

Состояние клавиши "Tab"

int

TERMINAL_KEYSTATE_PAGEUP

Состояние клавиши "PageUp"

int

TERMINAL_KEYSTATE_PAGEDOWN

Состояние клавиши "PageDown"

int

TERMINAL_KEYSTATE_ESCAPE

Состояние клавиши "Escape"

int

Вызов TerminalInfoInteger(TERMINAL_KEYSTATE_XXX) возвращает такой же код состояния клавиши, как и функция GetKeyState() из MSDN.

Пример вычисления коэффициента масштабирования:

//--- создаём кнопку шириной 1.5 дюйма на экране
int screen_dpi = TerminalInfoInteger(TERMINAL_SCREEN_DPI); // получим DPI монитора пользователя
int base_width = 144; // базовая ширина в экранных точках для стандартных мониторов c DPI=96
int width = (button_width * screen_dpi) / 96; // вычислим ширину кнопки для монитора пользователя (с учётом его DPI)
...

//--- вычисление коэффициента масштабирования в процентах
int scale_factor=(TerminalInfoInteger(TERMINAL_SCREEN_DPI) * 100) / 96;
//--- использование коэффициента масштабирования
width=(base_width * scale_factor) / 100;

При таком использовании графический ресурс будет иметь одинаковый на глаз размер на мониторах с различной разрешающей способностью. При этом размеры управляющих элементов (кнопки, окна диалогов и т.д.) будут соответствовать настройкам персонализации.

ENUM_TERMINAL_INFO_DOUBLE

Идентификатор | Описание | Тип свойства
TERMINAL_COMMUNITY_BALANCE | Баланс пользователя в MQL5.community | double

Файловые операции можно проводить только в двух каталогах, пути к которым можно получить при запросе свойств TERMINAL_DATA_PATH и TERMINAL_COMMONDATA_PATH.

ENUM_TERMINAL_INFO_STRING

Идентификатор | Описание | Тип свойства
TERMINAL_LANGUAGE | Язык терминала | string
TERMINAL_COMPANY | Имя компании | string
TERMINAL_NAME | Имя терминала | string
TERMINAL_PATH | Папка, из которой запущен терминал | string
TERMINAL_DATA_PATH | Папка, в которой хранятся данные терминала | string
TERMINAL_COMMONDATA_PATH | Общая папка всех клиентских терминалов, установленных на компьютере | string

Для лучшего понимания путей, хранящихся в свойствах параметров TERMINAL_PATH, TERMINAL_DATA_PATH и TERMINAL_COMMONDATA_PATH, рекомендуется выполнить скрипт, которых сообщит эти значения для данной копии терминала, установленного на вашем компьютере.

Пример: скрипт выводит информацию о путях терминала

//+------------------------------------------------------------------+
//| Check_TerminalPaths.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
Print("TERMINAL_PATH = ",TerminalInfoString(TERMINAL_PATH));
Print("TERMINAL_DATA_PATH = ",TerminalInfoString(TERMINAL_DATA_PATH));
Print("TERMINAL_COMMONDATA_PATH = ",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
}

В результате выполнения скрипта в Журнал Экспертов будут выведены сообщения, подобные приведенным на рисунке ниже.

Получение информации о рабочей папке терминала


Информация о запущенной MQL4-программе

Справочник MQL4 / Константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL4-программе

Информация о запущенной MQL4-программе

Константы, для получения информации о выполняющейся mql4-программе, перечислены в ENUM_MQL_INFO_INTEGER и ENUM_MQL_INFO_STRING.

Для функции MQLInfoInteger()

ENUM_MQL_INFO_INTEGER

Идентификатор | Описание | Тип свойства
MQL_CODEPAGE | Кодовая страница, используемая в MQL4 программе для вывода и конвертации строк (Print, PrintFormat, Alert, MessageBox, SendFTP, SendMail, SendNotification и т.д.) | Константа кодовой страницы
MQL_PROGRAM_TYPE | Тип MQL4 программы | ENUM_PROGRAM_TYPE
MQL_DLLS_ALLOWED | Разрешение на использование DLL для данной запущенной программы | bool
MQL_TRADE_ALLOWED | Разрешение на торговлю для данной запущенной программы | bool
MQL_SIGNALS_ALLOWED | Разрешение на работу с сигналами данной запущенной программы | bool
MQL_DEBUG | Признак работы запущенной программы в режиме отладки | bool
MQL_PROFILER | Признак работы запущенной программы в режиме профилирования кода | bool
MQL_TESTER | Признак работы запущенной программы в тестере | bool
MQL_OPTIMIZATION | Признак работы запущенной программы в процессе оптимизации | bool
MQL_VISUAL_MODE | Признак работы запущенной программы в визуальном режиме тестирования | bool
MQL_LICENSE_TYPE | Тип лицензии модуля EX4. Лицензия относится именно к тому модулю EX4, из которого делается запрос с помощью MQLInfoInteger(MQL_LICENSE_TYPE). | ENUM_LICENSE_TYPE

Для функции MQLInfoString()

ENUM_MQL_INFO_STRING

Идентификатор | Описание | Тип свойства
MQL_PROGRAM_NAME | Имя запущенной MQL4 программы | string
MQL_PROGRAM_PATH | Путь для данной запущенной программы | string

Для получения информации о типе выполняемой программы предназначены значения перечисления ENUM_PROGRAM_TYPE.

ENUM_PROGRAM_TYPE

Идентификатор | Описание
PROGRAM_SCRIPT | Скрипт
PROGRAM_EXPERT | Эксперт
PROGRAM_INDICATOR | Индикатор

ENUM_LICENSE_TYPE

Идентификатор | Описание
LICENSE_FREE | Бесплатная неограниченная версия
LICENSE_DEMO | Демо-версия платного продукта из Маркета. Работает только в тестере стратегий
LICENSE_FULL | Купленная лицензионная версия допускает не менее 5 активаций. Продавец может увеличить разрешенное число активаций
LICENSE_TIME | Версия с ограниченной по времени лицензией

Пример:

ENUM_PROGRAM_TYPE mql_program=(ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE);
switch(mql_program)
{
case PROGRAM_SCRIPT:
{
Print(__FILE__+" is script");
break;
}
case PROGRAM_EXPERT:
{
Print(__FILE__+" is Expert Advisor");
break;
}
case PROGRAM_INDICATOR:
{
Print(__FILE__+" is custom indicator");
break;
}
default:Print("MQL4 program type value is ",mql_program);
}


Информация об инструменте

Справочник MQL4 / Константы, перечисления и структуры / Состояние окружения / Информация об инструменте

Информация об инструменте

Для получения текущей рыночной информации служит функция MarketInfo(). Идентификаторы запроса могут быть одной из следующего величин:

Константа | Значение | Описание
MODE_LOW | 1 | Минимальная дневная цена
MODE_HIGH | 2 | Максимальная дневная цена
MODE_TIME | 5 | Время поступления последней котировки
MODE_BID | 9 | Последняя поступившая цена предложения. Для текущего инструмента хранится в предопределенной переменной Bid
MODE_ASK | 10 | Последняя поступившая цена продажи. Для текущего инструмента хранится в предопределенной переменной Ask
MODE_POINT | 11 | Размер пункта в валюте котировки. Для текущего инструмента хранится в предопределенной переменной Point
MODE_DIGITS | 12 | Количество цифр после запятой в цене инструмента. Для текущего инструмента хранится в предопределенной переменной Digits
MODE_SPREAD | 13 | Спрэд в пунктах
MODE_STOPLEVEL | 14 | Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах. Нулевое значение MODE_STOPLEVEL означает либо отсутствие ограничения на минимальную дистанцию для стоп-лосса/тейк-профита, либо факт использования торговым сервером внешних механизмов динамического контроля уровней, которые не могут быть транслированы в терминал. Во втором случае GetLastError() может возвращать ошибку 130, так как уровень MODE_STOPLEVEL фактически является "плавающим".
MODE_LOTSIZE | 15 | Размер контракта в базовой валюте инструмента
MODE_TICKVALUE | 16 | Размер минимального изменения цены инструмента в валюте депозита
MODE_TICKSIZE | 17 | Минимальный шаг изменения цены инструмента в пунктах
MODE_SWAPLONG | 18 | Размер свопа для ордеров на покупку
MODE_SWAPSHORT | 19 | Размер свопа для ордеров на продажу
MODE_STARTING | 20 | Календарная дата начала торгов (обычно используется для фьючерсов)
MODE_EXPIRATION | 21 | Календарная дата конца торгов (обычно используется для фьючерсов)
MODE_TRADEALLOWED | 22 | Разрешение торгов по указанному инструменту
MODE_MINLOT | 23 | Минимальный размер лота
MODE_LOTSTEP | 24 | Шаг изменения размера лота
MODE_MAXLOT | 25 | Максимальный размер лота
MODE_SWAPTYPE | 26 | Метод вычисления свопов. 0 - в пунктах; 1 - в базовой валюте инструмента; 2 - в процентах; 3 - в валюте залоговых средств.
MODE_PROFITCALCMODE | 27 | Способ расчета прибыли. 0 - Forex; 1 - CFD; 2 - Futures
MODE_MARGINCALCMODE | 28 | Способ расчета залоговых средств. 0 - Forex; 1 - CFD; 2 - Futures; 3 - CFD на индексы
MODE_MARGININIT | 29 | Начальные залоговые требования для 1 лота
MODE_MARGINMAINTENANCE | 30 | Размер залоговых средств для поддержки открытых ордеров в расчете на 1 лот
MODE_MARGINHEDGED | 31 | Маржа, взимаемая с перекрытых ордеров в расчете на 1 лот
MODE_MARGINREQUIRED | 32 | Размер свободных средств, необходимых для открытия 1 лота на покупку
MODE_FREEZELEVEL | 33 | Уровень заморозки ордеров в пунктах. Если цена исполнения находится в пределах, определяемых уровнем заморозки, то ордер не может быть модифицирован, отменен или закрыт.
MODE_CLOSEBY_ALLOWED | 34 | Разрешение на использование OrderCloseBy() для закрытия встречных ордеров на указанном символе

Пример:

//+------------------------------------------------------------------+
//| Скрипт выводит информацию об инструменте |
//+------------------------------------------------------------------+
void OnStart()
{
Print("Symbol=",Symbol());
Print("Минимальная дневная цена=",MarketInfo(Symbol(),MODE_LOW));
Print("Максимальная дневная цена=",MarketInfo(Symbol(),MODE_HIGH));
Print("Время поступления последней котировки=",(MarketInfo(Symbol(),MODE_TIME)));
Print("Последняя поступившая цена предложения=",MarketInfo(Symbol(),MODE_BID));
Print("Последняя поступившая цена продажи=",MarketInfo(Symbol(),MODE_ASK));
Print("Размер пункта в валюте котировки=",MarketInfo(Symbol(),MODE_POINT));
Print("Количество цифр после запятой в цене инструмента=",MarketInfo(Symbol(),MODE_DIGITS));
Print("Спрэд в пунктах=",MarketInfo(Symbol(),MODE_SPREAD));
Print("Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах=",MarketInfo(Symbol(),MODE_STOPLEVEL));
Print("Размер контракта в базовой валюте инструмента=",MarketInfo(Symbol(),MODE_LOTSIZE));
Print("Размер минимального изменения цены инструмента в валюте депозита=",MarketInfo(Symbol(),MODE_TICKVALUE));
Print("Минимальный шаг изменения цены инструмента в пунктах=",MarketInfo(Symbol(),MODE_TICKSIZE));
Print("Размер свопа для ордеров на покупку=",MarketInfo(Symbol(),MODE_SWAPLONG));
Print("Размер свопа для ордеров на продажу=",MarketInfo(Symbol(),MODE_SWAPSHORT));
Print("Календарная дата начала торгов (фьючерсы)=",MarketInfo(Symbol(),MODE_STARTING));
Print("Календарная дата окончания торгов (фьючерсы)=",MarketInfo(Symbol(),MODE_EXPIRATION));
Print("Разрешение торгов по указанному инструменту=",MarketInfo(Symbol(),MODE_TRADEALLOWED));
Print("Минимальный размер лота=",MarketInfo(Symbol(),MODE_MINLOT));
Print("Шаг изменения размера лота=",MarketInfo(Symbol(),MODE_LOTSTEP));
Print("Максимальный размер лота=",MarketInfo(Symbol(),MODE_MAXLOT));
Print("Метод вычисления свопов=",MarketInfo(Symbol(),MODE_SWAPTYPE));
Print("Способ расчета прибыли=",MarketInfo(Symbol(),MODE_PROFITCALCMODE));
Print("Способ расчета залоговых средств=",MarketInfo(Symbol(),MODE_MARGINCALCMODE));
Print("Начальные залоговые требования для 1 лота=",MarketInfo(Symbol(),MODE_MARGININIT));
Print("Размер залоговых средств для поддержки открытых ордеров в расчете на 1 лот=",MarketInfo(Symbol(),MODE_MARGINMAINTENANCE));
Print("Маржа, взимаемая с перекрытых ордеров в расчете на 1 лот=",MarketInfo(Symbol(),MODE_MARGINHEDGED));
Print("Размер свободных средств, необходимых для открытия 1 лота на покупку=",MarketInfo(Symbol(),MODE_MARGINREQUIRED));
Print("Уровень заморозки ордеров в пунктах=",MarketInfo(Symbol(),MODE_FREEZELEVEL));
}

Для получения текущей рыночной информации используются функции SymbolInfoInteger(), SymbolInfoDouble() и SymbolInfoString(). В качестве второго параметра этих функций допустимо передавать один из идентификаторов из перечислений ENUM_SYMBOL_INFO_INTEGER, ENUM_SYMBOL_INFO_DOUBLE и ENUM_SYMBOL_INFO_STRING соответственно.

Для функции SymbolInfoInteger():

ENUM_SYMBOL_INFO_INTEGER

Идентификатор | Описание | Тип свойства
SYMBOL_SELECT | Признак того, что символ выбран в Market Watch. Некоторые символы могут не отображаться в Market Watch, но при этом быть выбранными. | bool
SYMBOL_VISIBLE | Признак того, что выбранный символ отображается в Market Watch. Некоторые символы (как правило, это кросс-курсы, которые необходимы для расчёта маржевых требований и прибыли в валюте депозита) выбираются автоматически, но при этом обычно не отображаются в Market Watch. Для отображения такие символы должны быть выбраны явно. | bool
SYMBOL_SESSION_DEALS | Не поддерживается | long
SYMBOL_SESSION_BUY_ORDERS | Не поддерживается | long
SYMBOL_SESSION_SELL_ORDERS | Не поддерживается | long
SYMBOL_VOLUME | Не поддерживается | long
SYMBOL_VOLUMEHIGH | Не поддерживается | long
SYMBOL_VOLUMELOW | Не поддерживается | long
SYMBOL_TIME | Время последней котировки | datetime
SYMBOL_DIGITS | Количество знаков после запятой | int
SYMBOL_SPREAD | Размер спреда в пунктах | int
SYMBOL_SPREAD_FLOAT | Признак плавающего спреда | bool
SYMBOL_TRADE_CALC_MODE | Способ вычисления стоимости контракта | int
SYMBOL_TRADE_MODE | Тип исполнения ордеров | ENUM_SYMBOL_TRADE_MODE
SYMBOL_START_TIME | Дата начала торгов по инструменту (обычно используется для фьючерсов) | datetime
SYMBOL_EXPIRATION_TIME | Дата окончания торгов по инструменту (обычно используется для фьючерсов) | datetime
SYMBOL_TRADE_STOPS_LEVEL | Минимальный отступ в пунктах от текущей цены закрытия для установки Stop ордеров | int
SYMBOL_TRADE_FREEZE_LEVEL | Дистанция заморозки торговых операций (в пунктах) | int
SYMBOL_TRADE_EXEMODE | Режим заключения сделок | ENUM_SYMBOL_TRADE_EXECUTION
SYMBOL_SWAP_MODE | Модель расчета свопа | int
SYMBOL_SWAP_ROLLOVER3DAYS | День недели для начисления тройного свопа | ENUM_DAY_OF_WEEK
SYMBOL_EXPIRATION_MODE | Не поддерживается | int
SYMBOL_FILLING_MODE | Не поддерживается | int
SYMBOL_ORDER_MODE | Не поддерживается | int

Для функции SymbolInfoDouble():

ENUM_SYMBOL_INFO_DOUBLE

Идентификатор | Описание | Тип свойства
SYMBOL_BID | Bid - лучшее предложение на продажу | double
SYMBOL_BIDHIGH | Не поддерживается | double
SYMBOL_BIDLOW | Не поддерживается | double
SYMBOL_ASK | Ask - лучшее предложение на покупку | double
SYMBOL_ASKHIGH | Не поддерживается | double
SYMBOL_ASKLOW | Не поддерживается | double
SYMBOL_LAST | Не поддерживается | double
SYMBOL_LASTHIGH | Не поддерживается | double
SYMBOL_LASTLOW | Не поддерживается | double
SYMBOL_POINT | Значение одного пункта | double
SYMBOL_TRADE_TICK_VALUE | Значение SYMBOL_TRADE_TICK_VALUE_PROFIT | double
SYMBOL_TRADE_TICK_VALUE_PROFIT | Не поддерживается | double
SYMBOL_TRADE_TICK_VALUE_LOSS | Не поддерживается | double
SYMBOL_TRADE_TICK_SIZE | Минимальное изменение цены | double
SYMBOL_TRADE_CONTRACT_SIZE | Размер торгового контракта | double
SYMBOL_VOLUME_MIN | Минимальный объем для заключения сделки | double
SYMBOL_VOLUME_MAX | Максимальный объем для заключения сделки | double
SYMBOL_VOLUME_STEP | Минимальный шаг изменения объема для заключения сделки | double
SYMBOL_VOLUME_LIMIT | Не поддерживается | double
SYMBOL_SWAP_LONG | Значение свопа в покупку | double
SYMBOL_SWAP_SHORT | Значение свопа в продажу | double
SYMBOL_MARGIN_INITIAL | Начальная (инициирующая) маржа обозначает размер необходимых залоговых средств в маржинальной валюте для открытия ордера объемом в один лот. Используется при проверке средств клиента при входе в рынок. | double
SYMBOL_MARGIN_MAINTENANCE | Поддерживающая маржа по инструменту. В случае если задана – указывает размер маржи в маржинальной валюте инструмента, удерживаемой с одного лота. Используется при проверке средств клиента при изменении состояния счета клиента. Если поддерживающая маржа равна 0, то используется начальная маржа. | double
SYMBOL_MARGIN_LONG | Не поддерживается | double
SYMBOL_MARGIN_SHORT | Не поддерживается | double
SYMBOL_MARGIN_LIMIT | Не поддерживается | double
SYMBOL_MARGIN_STOP | Не поддерживается | double
SYMBOL_MARGIN_STOPLIMIT | Не поддерживается | double
SYMBOL_SESSION_VOLUME | Не поддерживается | double
SYMBOL_SESSION_TURNOVER | Не поддерживается | double
SYMBOL_SESSION_INTEREST | Не поддерживается | double
SYMBOL_SESSION_BUY_ORDERS_VOLUME | Не поддерживается | double
SYMBOL_SESSION_SELL_ORDERS_VOLUME | Не поддерживается | double
SYMBOL_SESSION_OPEN | Не поддерживается | double
SYMBOL_SESSION_CLOSE | Не поддерживается | double
SYMBOL_SESSION_AW | Не поддерживается | double
SYMBOL_SESSION_PRICE_SETTLEMENT | Не поддерживается | double
SYMBOL_SESSION_PRICE_LIMIT_MIN | Не поддерживается | double
SYMBOL_SESSION_PRICE_LIMIT_MAX | Не поддерживается | double

Для функции SymbolInfoString():

ENUM_SYMBOL_INFO_STRING

Идентификатор | Описание | Тип свойства
SYMBOL_CURRENCY_BASE | Базовая валюта инструмента | string
SYMBOL_CURRENCY_PROFIT | Валюта прибыли | string
SYMBOL_CURRENCY_MARGIN | Валюта в которой вычисляется залоговые средства | string
SYMBOL_DESCRIPTION | Строковое описание символа | string
SYMBOL_PATH | Путь в дереве символов | string

Существует несколько режимов торговли по финансовым инструментам. Информация о режимах торговли по конкретному инструменту отображена в значениях перечисления ENUM_SYMBOL_TRADE_MODE.

ENUM_SYMBOL_TRADE_MODE

Идентификатор | Описание
SYMBOL_TRADE_MODE_DISABLED | Торговля по символу запрещена
SYMBOL_TRADE_MODE_LONGONLY | Разрешены только покупки
SYMBOL_TRADE_MODE_SHORTONLY* | Разрешены только продажи
SYMBOL_TRADE_MODE_CLOSEONLY* | Разрешены только операции закрытия позиций
SYMBOL_TRADE_MODE_FULL | Нет ограничений на торговые операции

Возможные режимы заключения сделок по конкретному инструменту определены в перечислении ENUM_SYMBOL_TRADE_EXECUTION.

ENUM_SYMBOL_TRADE_EXECUTION

Идентификатор | Описание
SYMBOL_TRADE_EXECUTION_REQUEST | Торговля по запросу
SYMBOL_TRADE_EXECUTION_INSTANT | Торговля по потоковым ценам
SYMBOL_TRADE_EXECUTION_MARKET | Исполнение ордеров по рынку
SYMBOL_TRADE_EXECUTION_EXCHANGE* | Биржевое исполнение

*Данные значения не используются в MQL4 (добавлены для совместимости с MQL5).

Для указания дня недели предназначены значения перечисления ENUM_DAY_OF_WEEK.

ENUM_DAY_OF_WEEK

Идентификатор | Описание
SUNDAY | Воскресенье
MONDAY | Понедельник
TUESDAY | Вторник
WEDNESDAY | Среда
THURSDAY | Четверг
FRIDAY | Пятница
SATURDAY | Суббота


Информация о счете

Справочник MQL4 / Константы, перечисления и структуры / Состояние окружения / Информация о счете

Информация о счете

Для получения информации о текущем счете предназначены функции AccountInfoInteger(), AccountInfoDouble() и AccountInfoString(). В качестве параметра эти функции принимают значения из соответствующих перечислений ENUM_ACCOUNT_INFO.

Для функции AccountInfoInteger()

ENUM_ACCOUNT_INFO_INTEGER

Идентификатор | Описание | Тип свойства
ACCOUNT_LOGIN | Номер счета | long
ACCOUNT_TRADE_MODE | Тип торгового счета | ENUM_ACCOUNT_TRADE_MODE
ACCOUNT_LEVERAGE | Размер предоставленного плеча | long
ACCOUNT_LIMIT_ORDERS | Максимально допустимое количество открытых позиций и действующих отложенных ордеров (суммарно), 0 — ограничений нет | int
ACCOUNT_MARGIN_SO_MODE | Режим задания минимально допустимого уровня залоговых средств | ENUM_ACCOUNT_STOPOUT_MODE
ACCOUNT_TRADE_ALLOWED | Разрешенность торговли для текущего счета | bool
ACCOUNT_TRADE_EXPERT | Разрешенность торговли для эксперта | bool

Для функции AccountInfoDouble()

ENUM_ACCOUNT_INFO_DOUBLE

Идентификатор | Описание | Тип свойства
ACCOUNT_BALANCE | Баланс счета в валюте депозита | double
ACCOUNT_CREDIT | Размер предоставленного кредита в валюте депозита | double
ACCOUNT_PROFIT | Размер текущей прибыли на счете в валюте депозита | double
ACCOUNT_EQUITY | Значение собственных средств на счете в валюте депозита | double
ACCOUNT_MARGIN | Размер зарезервированных залоговых средств на счете в валюте депозита | double
ACCOUNT_MARGIN_FREE | Размер свободных средств на счете в валюте депозита, доступных для открытия ордера | double
ACCOUNT_MARGIN_LEVEL | Уровень залоговых средств на счете в процентах | double
ACCOUNT_MARGIN_SO_CALL | Уровень залоговых средств, при котором требуется пополнение счета (Margin Call). В зависимости от установленного ACCOUNT_MARGIN_SO_MODE выражается в процентах либо в валюте депозита | double
ACCOUNT_MARGIN_SO_SO | Уровень залоговых средств, при достижении которого происходит принудительное закрытие самого убыточного ордера (Stop Out). В зависимости от установленного ACCOUNT_MARGIN_SO_MODE выражается в процентах либо в валюте депозита | double
ACCOUNT_MARGIN_INITIAL | Не поддерживается | double
ACCOUNT_MARGIN_MAINTENANCE | Не поддерживается | double
ACCOUNT_ASSETS | Не поддерживается | double
ACCOUNT_LIABILITIES | Не поддерживается | double
ACCOUNT_COMMISSION_BLOCKED | Не поддерживается | double

Для функции AccountInfoString()

ENUM_ACCOUNT_INFO_STRING

Идентификатор | Описание | Тип свойства
ACCOUNT_NAME | Имя клиента | string
ACCOUNT_SERVER | Имя торгового сервера | string
ACCOUNT_CURRENCY | Валюта депозита | string
ACCOUNT_COMPANY | Имя компании, обслуживающей счет | string

Существует несколько видов счетов, которые могут быть открыты на торговом сервере. Для того чтобы узнать тип счета, на котором работает MQL4-программа, предназначено перечисление ENUM_ACCOUNT_TRADE_MODE.

ENUM_ACCOUNT_TRADE_MODE

Идентификатор | Описание
ACCOUNT_TRADE_MODE_DEMO | Демонстрационный торговый счет
ACCOUNT_TRADE_MODE_CONTEST | Конкурсный торговый счет
ACCOUNT_TRADE_MODE_REAL | Реальный торговый счет

При нехватке собственных средств для поддержания открытых ордеров возникает ситуация принудительного закрытия Stop Out. Минимальный уровень маржи, при котором наступает Stop Out, может задаваться в процентах или в денежном выражении. Узнать какой режим задан для данного счета можно с помощью перечисления ENUM_ACCOUNT_STOPOUT_MODE.

ENUM_ACCOUNT_STOPOUT_MODE

Идентификатор | Описание
ACCOUNT_STOPOUT_MODE_PERCENT | Уровень задается в процентах
ACCOUNT_STOPOUT_MODE_MONEY | Уровень задается в деньгах

Пример скрипта, выводящего краткую информацию о счете.

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- имя компании
string company=AccountInfoString(ACCOUNT_COMPANY);
//--- имя клиента
string name=AccountInfoString(ACCOUNT_NAME);
//--- номер счета
long login=AccountInfoInteger(ACCOUNT_LOGIN);
//--- имя сервера
string server=AccountInfoString(ACCOUNT_SERVER);
//--- валюта счета
string currency=AccountInfoString(ACCOUNT_CURRENCY);
//--- демо, конкурсный или реальный счет
ENUM_ACCOUNT_TRADE_MODE account_type=(ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE);
//--- теперь превратим значение перечисления в понятный вид
string trade_mode;
switch(account_type)
{
case ACCOUNT_TRADE_MODE_DEMO:
trade_mode="demo";
break;
case ACCOUNT_TRADE_MODE_CONTEST:
trade_mode="конкурсный";
break;
default:
trade_mode="реальный";
break;
}
//--- в процентах или в денежном выражении задается уровень Stop Out
ENUM_ACCOUNT_STOPOUT_MODE stop_out_mode=(ENUM_ACCOUNT_STOPOUT_MODE)AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE);
//--- получим значения уровней, при которых наступает Margin Call и Stop Out
double margin_call=AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL);
double stop_out=AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);
//--- выведем краткую информацию по счету
PrintFormat("Счет клиента '%s' #%d %s открыт в '%s' на сервере '%s'",
name,login,trade_mode,company,server);
PrintFormat("Валюта счета - %s, уровень MarginCall и StopOut задается в %s",
currency,(stop_out_mode==ACCOUNT_STOPOUT_MODE_PERCENT)?"процентах":" в деньгах");
PrintFormat("Уровень MarginCall=%G, уровень StopOut=%G",margin_call,stop_out);
}


Статистика тестирования

Справочник MQL4 / Константы, перечисления и структуры / Состояние окружения / Статистика тестирования

Статистика тестирования

После окончания тестирования вычисляются статистические показатели результатов торговли по множеству параметров. Значения показателей можно получить с помощью функции TesterStatistics(), указав идентификатор показателя из перечисления ENUM_STATISTICS.

Хотя при вычислении статистики используются показатели двух типов - int и double - функция возвращает все значения в виде double. Все статистические величины, имеющие тип double, по умолчанию выражаются в валюте депозита, если не сказано иное.

ENUM_STATISTICS

Идентификатор | Описание статистического показателя | Тип
STAT_INITIAL_DEPOSIT | Значение начального депозита | double
STAT_PROFIT | Чистая прибыль по окончании тестирования, сумма STAT_GROSS_PROFIT и STAT_GROSS_LOSS (STAT_GROSS_LOSS всегда меньше или равно нулю) | double
STAT_GROSS_PROFIT | Общая прибыль, сумма всех прибыльных (положительных) трейдов. Значение больше или равно нулю | double
STAT_GROSS_LOSS | Общий убыток, сумма всех убыточных (отрицательных) трейдов. Значение меньше или равно нулю | double
STAT_MAX_PROFITTRADE | Максимальная прибыль – наибольшее значение среди всех прибыльных трейдов. Значение больше или равно нулю | double
STAT_MAX_LOSSTRADE | Максимальный убыток – наименьшее значение среди всех убыточных трейдов. Значение меньше или равно нулю | double
STAT_CONPROFITMAX | Максимальная прибыль в последовательности прибыльных трейдов. Значение больше или равно нулю | double
STAT_CONPROFITMAX_TRADES | Количество трейдов, сформировавших STAT_CONPROFITMAX (максимальная прибыль в последовательности прибыльных трейдов) | int
STAT_MAX_CONWINS | Общая прибыль в самой длинной серии прибыльных трейдов | double
STAT_MAX_CONPROFIT_TRADES | Количество трейдов в самой длинной серии прибыльных трейдов STAT_MAX_CONWINS | int
STAT_CONLOSSMAX | Максимальный убыток в последовательности убыточных трейдов. Значение меньше или равно нулю | double
STAT_CONLOSSMAX_TRADES | Количество трейдов, сформировавших STAT_CONLOSSMAX (максимальный убыток в последовательности убыточных трейдов) | int
STAT_MAX_CONLOSSES | Общий убыток в самой длинной серии убыточных трейдов | double
STAT_MAX_CONLOSS_TRADES | Количество трейдов в самой длинной серии убыточных трейдов STAT_MAX_CONLOSSES | int
STAT_BALANCEMIN | Минимальное значение баланса | double
STAT_BALANCE_DD | Максимальная просадка баланса в деньгах. В процессе торговли баланс может испытать множество просадок, берется наибольшее значение. | double
STAT_BALANCEDD_PERCENT | Просадка баланса в процентах, которая была зафиксирована в момент максимальной просадки баланса в деньгах (STAT_BALANCE_DD). | double
STAT_BALANCE_DDREL_PERCENT | Максимальная просадка баланса в процентах. В процессе торговли баланс может испытать множество просадок, для каждой фиксируется относительное значение просадки в процентах. Возвращается наибольшее значение | double
STAT_BALANCE_DD_RELATIVE | Просадка баланса в деньгах, которая была зафиксирована в момент максимальной просадки баланса в процентах (STAT_BALANCE_DDREL_PERCENT). | double
STAT_EQUITYMIN | Минимальное значение собственных средств | double
STAT_EQUITY_DD | Максимальная просадка средств в деньгах. В процессе торговли средства могут испытать множество просадок, берется наибольшее значение. | double
STAT_EQUITYDD_PERCENT | Просадка средств в процентах, которая была зафиксирована в момент максимальной просадки средств в деньгах (STAT_EQUITY_DD). | double
STAT_EQUITY_DDREL_PERCENT | Максимальная просадка средств в процентах. В процессе торговли средства могут испытать множество просадок, для каждой фиксируется относительное значение просадки в процентах. Возвращается наибольшее значение | double
STAT_EQUITY_DD_RELATIVE | Просадка средств в деньгах, которая была зафиксирована в момент максимальной просадки средств в процентах (STAT_EQUITY_DDREL_PERCENT). | double
STAT_EXPECTED_PAYOFF | Математическое ожидание выигрыша | double
STAT_PROFIT_FACTOR | Прибыльность – отношение STAT_GROSS_PROFIT/STAT_GROSS_LOSS. Если STAT_GROSS_LOSS=0, то прибыльность принимает значение DBL_MAX | double
STAT_MIN_MARGINLEVEL | Миниимальное достигнутое значение уровня маржи | double
STAT_CUSTOM_ONTESTER | Значение рассчитанного пользовательского критерия оптимизации, возвращаемого функцией OnTester() | double
STAT_TRADES | Количество трейдов | int
STAT_PROFIT_TRADES | Прибыльные трейды | int
STAT_LOSS_TRADES | Убыточные трейды | int
STAT_SHORT_TRADES | Короткие трейды | int
STAT_LONG_TRADES | Длинные трейды | int
STAT_PROFIT_SHORTTRADES | Короткие прибыльные трейды | int
STAT_PROFIT_LONGTRADES | Длинные прибыльные трейды | int
STAT_PROFITTRADES_AVGCON | Средняя длина прибыльной серии трейдов | int
STAT_LOSSTRADES_AVGCON | Средняя длина убыточной серии трейдов | int


Торговые константы

Справочник MQL4 / Константы, перечисления и структуры / Торговые константы

Торговые константы

Разнообразные константы, используемые для программирования торговых стратегий, разделены на следующие группы:

  • Информация об исторических данных по инструменту – получение общей информации по финансовому инструменту;
  • Свойства ордеров – получение информации о торговых ордерах;
  • Свойства сигналов - получение информации о торговых сигналах;

Что нового в MQL5

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

Саму торговлю в MQL5 теперь также можно построить по-новому – на основе контроля торговых транзакций с помощью обработки событий. Больше не требуется самому опрашивать состояние отложенных ордеров и открытых позиций. Обработчик OnTradeTransaction() получит все изменения на торговом счете: срабатывание ордера, совершение сделки, открытие позиции и т.д. Вам только необходимо проанализировать информацию о полученной транзакции и отреагировать на неё в соответствие с логикой вашей торговой системы.

Для скальперских и арбитражных стратегий предназначены функции по работе со стаканом цен. Эти функции позволяют непрерывно и без задержек получать от тогового сервера все изменения в заявках на продажу и покупку. Новые константы помогут вам анализировать поток котировок и совершенные сделки по всем выбранным инструментам. Быстрый язык MQL5 и асинхронные операции позволят вам принимать торговые решения в режиме реального времени и без задержек.


Информация об исторических данных по инструменту

Справочник MQL4 / Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту

Информация об исторических данных по инструменту

При доступе к таймсериям для получения дополнительной информации об инструменте используется функция SeriesInfoInteger(). В качестве параметра этой функции передается идентификатор требуемого свойства, который может принимать одно из значений перечисления ENUM_SERIES_INFO_INTEGER.

ENUM_SERIES_INFO_INTEGER

Идентификатор | Описание | Тип свойства
SERIES_BARS_COUNT | Количество баров по символу-периоду на данный момент | long
SERIES_FIRSTDATE | Самая первая дата по символу-периоду на данный момент | datetime
SERIES_LASTBAR_DATE | Время открытия последнего бара по символу-периоду | datetime
SERIES_SERVER_FIRSTDATE | Самая первая дата в истории по символу на сервере независимо от периода | datetime


Свойства ордеров

Справочник MQL4 / Константы, перечисления и структуры / Торговые константы / Свойства ордеров

Свойства ордеров

Тип операций для функции OrderSend(). Mожет быть любым из следующих величин:

Константа | Значение | Описание
OP_BUY | 0 | Покупка
OP_SELL | 1 | Продажа
OP_BUYLIMIT | 2 | Отложенный ордер BUY LIMIT
OP_SELLLIMIT | 3 | Отложенный ордер SELL LIMIT
OP_BUYSTOP | 4 | Отложенный ордер BUY STOP
OP_SELLSTOP | 5 | Отложенный ордер SELL STOP


Свойства сигналов

Справочник MQL4 / Константы, перечисления и структуры / Торговые константы / Свойства сигналов

Свойства сигналов

Значения перечислений для работы с торговыми сигналами и настройками их копирования.

Перечисления свойств типа double торговых сигналов:

ENUM_SIGNAL_BASE_DOUBLE

Константа | Описание
SIGNAL_BASE_BALANCE | Баланс счета
SIGNAL_BASE_EQUITY | Средства на счете
SIGNAL_BASE_GAIN | Прирост счета в процентах
SIGNAL_BASE_MAX_DRAWDOWN | Максимальная просадка
SIGNAL_BASE_PRICE | Цена подписки на сигнал
SIGNAL_BASE_ROI | Значение ROI (Return on Investment) сигнала в %

Перечисления свойств типа integer торговых сигналов:

ENUM_SIGNAL_BASE_INTEGER

Константа | Описание
SIGNAL_BASE_DATE_PUBLISHED | Дата публикации сигнала (когда стал доступен для подписки)
SIGNAL_BASE_DATE_STARTED | Дата начала мониторинга сигнала
SIGNAL_BASE_ID | ID сигнала
SIGNAL_BASE_LEVERAGE | Плечо торгового счета
SIGNAL_BASE_PIPS | Результат торговли в пипсах
SIGNAL_BASE_RATING | Позиция в рейтинге сигналов
SIGNAL_BASE_SUBSCRIBERS | Количество подписчиков
SIGNAL_BASE_TRADES | Количество трейдов
SIGNAL_BASE_TRADE_MODE | Тип счета (0-реальный счет, 1-демо-счет, 2-конкурсный счет)

Перечисления свойств типа string торговых сигналов:

ENUM_SIGNAL_BASE_STRING

Константа | Описание
SIGNAL_BASE_AUTHOR_LOGIN | Логин автора сигнала
SIGNAL_BASE_BROKER | Наименование брокера (компании)
SIGNAL_BASE_BROKER_SERVER | Сервер брокера
SIGNAL_BASE_NAME | Имя сигнала
SIGNAL_BASE_CURRENCY | Валюта счета сигнала

Перечисления свойств типа double настроек копирования торговых сигналов:

ENUM_SIGNAL_INFO_DOUBLE

Константа | Описание
SIGNAL_INFO_EQUITY_LIMIT | Минимальное значение собственных средств, ниже которого копирование сделок будет автоматически остановлено и все открытые ордера по подписке будут закрыты
SIGNAL_INFO_SLIPPAGE | Величина допустимого проскальзывания при копировании сделок, указывается в спредах
SIGNAL_INFO_VOLUME_PERCENT | Процент конвертации объёмов при копировании сделок, r/o

Перечисления свойств типа integer настроек копирования торговых сигналов:

ENUM_SIGNAL_INFO_INTEGER

Константа | Описание
SIGNAL_INFO_CONFIRMATIONS_DISABLED | Флаг разрешения синхронизации без показа диалога подтверждения
SIGNAL_INFO_COPY_SLTP | Флаг копирования Stop Loss и Take Profit
SIGNAL_INFO_DEPOSIT_PERCENT | Процент средств на торговом счёте, который используется для торговли по сигналам провайдера (в %)
SIGNAL_INFO_ID | id сигнала, r/o
SIGNAL_INFO_SUBSCRIPTION_ENABLED | Флаг разрешения на копирование сделок по подписке
SIGNAL_INFO_TERMS_AGREE | Флаг согласия с условиями использования сервиса "Сигналы", r/o

Перечисления свойств типа string настроек копирования торговых сигналов:

ENUM_SIGNAL_INFO_STRING

Константа | Описание
SIGNAL_INFO_NAME | Имя сигнала, r/o

Смотри также

Управление сигналами


Именованные константы

Справочник MQL4 / Константы, перечисления и структуры / Именованные константы

Именованные константы

Все используемые в языке MQL4 константы можно разбить на следующие группы:

  • Предопределенные макроподстановки – значения подставляются на этапе компиляции;
  • Математические константы – значения некоторых математических выражений;
  • Константы числовых типов – ограничения, накладываемые на простые типы;
  • Причины деинициализации – описание причин деинициализации;
  • Проверка указателя объекта – перечисление типов указателей, возвращаемых функцией CheckPointer() ;
  • Прочие константы – все, что не вошло в остальные группы констант.


Предопределенные макроподстановки

Справочник MQL4 / Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки

Предопределенные макроподстановки

Для облегчения отладки и получения информации о работе mql4-программы введены специальные константы-макросы, значения которых устанавливается в момент компиляции. Самый простой путь использования этих констант – вывод значений с помощью функции Print(), как показано в примере.

Константа | Описание
__DATE__ | Дата компиляции файла без времени (часы, минуты и секунды равны 0)
__DATETIME__ | Дата и время компиляции файла
__LINE__ | Номер строки в исходном коде, на которой расположен данный макрос
__FILE__ | Имя текущего компилируемого файла
__PATH__ | Абсолютный путь к текущему компилируемому файлу
__FUNCTION__ | Имя функции, в теле которой расположен макрос
__FUNCSIG__ | Сигнатура функции, в теле которой расположен макрос. Вывод в лог полного описания функции с типами параметров может пригодиться при идентификации перегруженных функций
__MQLBUILD__, __MQL4BUILD__ | Номер билда компилятора

Пример:

#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net"
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- пример вывода информации при инициализации советника
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
//--- установка интервала между событиями таймера
EventSetTimer(5);
//---
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- пример вывода информации при деинициализации советника
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{

//--- вывод информации при поступлении тика
Print(" __MQLBUILD__ = ",__MQLBUILD__," __FILE__ = ",__FILE__);
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
test1(__FUNCTION__);
test2();
//---
}
//+------------------------------------------------------------------+
//| test1 |
//+------------------------------------------------------------------+
void test1(string par)
{
//--- вывод информации внутри функции
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__," par=",par);
}
//+------------------------------------------------------------------+
//| test2 |
//+------------------------------------------------------------------+
void test2()
{
//--- вывод информации внутри функции
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
}
//+------------------------------------------------------------------+
//| OnTimer event handler |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
test1(__FUNCTION__);
}
//+------------------------------------------------------------------+


Математические константы

Справочник MQL4 / Константы, перечисления и структуры / Именованные константы / Математические константы

Математические константы

Для некоторых математических выражений зарезервированы специальные константы, содержащие значения. Эти константы можно использовать в любом месте mql4-программы вместо вычисления их значения с помощью математических функций.

Константа | Описание | Значение
M_E | e | 2.71828182845904523536
M_LOG2E | log2(e) | 1.44269504088896340736
M_LOG10E | log10(e) | 0.434294481903251827651
M_LN2 | ln(2) | 0.693147180559945309417
M_LN10 | ln(10) | 2.30258509299404568402
M_PI | pi | 3.14159265358979323846
M_PI_2 | pi/2 | 1.57079632679489661923
M_PI_4 | pi/4 | 0.785398163397448309616
M_1_PI | 1/pi | 0.318309886183790671538
M_2_PI | 2/pi | 0.636619772367581343076
M_2_SQRTPI | 2/sqrt(pi) | 1.12837916709551257390
M_SQRT2 | sqrt(2) | 1.41421356237309504880
M_SQRT1_2 | 1/sqrt(2) | 0.707106781186547524401

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- выведем значения констант
Print("M_E = ",DoubleToString(M_E,16));
Print("M_LOG2E = ",DoubleToString(M_LOG2E,16));
Print("M_LOG10E = ",DoubleToString(M_LOG10E,16));
Print("M_LN2 = ",DoubleToString(M_LN2,16));
Print("M_LN10 = ",DoubleToString(M_LN10,16));
Print("M_PI = ",DoubleToString(M_PI,16));
Print("M_PI_2 = ",DoubleToString(M_PI_2,16));
Print("M_PI_4 = ",DoubleToString(M_PI_4,16));
Print("M_1_PI = ",DoubleToString(M_1_PI,16));
Print("M_2_PI = ",DoubleToString(M_2_PI,16));
Print("M_2_SQRTPI = ",DoubleToString(M_2_SQRTPI,16));
Print("M_SQRT2 = ",DoubleToString(M_SQRT2,16));
Print("M_SQRT1_2 = ",DoubleToString(M_SQRT1_2,16));
}


Константы числовых типов

Справочник MQL4 / Константы, перечисления и структуры / Именованные константы / Константы числовых типов

Константы числовых типов данных

Каждый простой числовой тип предназначен для определенного круга задач и позволяет оптимизировать работу mql4-программы при правильном применении. Для лучшей читаемости кода и правильной обработки результатов вычислений введены константы, которые позволяют получить информацию об ограничениях, накладываемых на тот или иной тип простых данных.

Константа | Описание | Значение
CHAR_MIN | Минимальное значение, которое может быть представлено типом char | -128
CHAR_MAX | Максимальное значение, которое может быть представлено типом char | 127
UCHAR_MAX | Максимальное значение, которое может быть представлено типом uchar | 255
SHORT_MIN | Минимальное значение, которое может быть представлено типом short | -32768
SHORT_MAX | Максимальное значение, которое может быть представлено типом short | 32767
USHORT_MAX | Максимальное значение, которое может быть представлено типом ushort | 65535
INT_MIN | Минимальное значение, которое может быть представлено типом int | -2147483648
INT_MAX | Максимальное значение, которое может быть представлено типом int | 2147483647
UINT_MAX | Максимальное значение, которое может быть представлено типом uint | 4294967295
LONG_MIN | Минимальное значение, которое может быть представлено типом long | -9223372036854775808
LONG_MAX | Максимальное значение, которое может быть представлено типом long | 9223372036854775807
ULONG_MAX | Максимальное значение, которое может быть представлено типом ulong | 18446744073709551615
DBL_MIN | Минимальное положительное значение, которое может быть представлено типом double | 2.2250738585072014e-308
DBL_MAX | Максимальное значение, которое может быть представлено типом double | 1.7976931348623158e+308
DBL_EPSILON | Наименьшее число для которого выполняется условие 1.0+DBL_EPSILON != 1.0 | 2.2204460492503131e-016
DBL_DIG | Количество значимых десятичных знаков | 15
DBL_MANT_DIG | Количество битов в мантиссе | 53
DBL_MAX_10_EXP | Максимальное десятичное значение степени экспоненты | 308
DBL_MAX_EXP | Максимальное двоичное значение степени экспоненты | 1024
DBL_MIN_10_EXP | Минимальное десятичное значение степени экспоненты | (-307)
DBL_MIN_EXP | Минимальное двоичное значение степени экспоненты | (-1021)
FLT_MIN | Минимальное положительное значение, которое может быть представлено типом float | 1.175494351e-38
FLT_MAX | Максимальное значение, которое может быть представлено типом float | 3.402823466e+38
FLT_EPSILON | Наименьшее число для которого выполняется условие 1.0+FLT_EPSILON != 1.0 | 1.192092896e–07
FLT_DIG | Количество значимых десятичных знаков | 6
FLT_MANT_DIG | Количество битов в мантиссе | 24
FLT_MAX_10_EXP | Максимальное десятичное значение степени экспоненты | 38
FLT_MAX_EXP | Максимальное двоичное значение степени экспоненты | 128
FLT_MIN_10_EXP | Минимальное десятичное значение степени экспоненты | -37
FLT_MIN_EXP | Минимальное двоичное значение степени экспоненты | (-125)

Пример:

void OnStart()
{
//--- выведем значения констант
printf("CHAR_MIN = %d",CHAR_MIN);
printf("CHAR_MAX = %d",CHAR_MAX);
printf("UCHAR_MAX = %d",UCHAR_MAX);
printf("SHORT_MIN = %d",SHORT_MIN);
printf("SHORT_MAX = %d",SHORT_MAX);
printf("USHORT_MAX = %d",USHORT_MAX);
printf("INT_MIN = %d",INT_MIN);
printf("INT_MAX = %d",INT_MAX);
printf("UINT_MAX = %u",UINT_MAX);
printf("LONG_MIN = %I64d",LONG_MIN);
printf("LONG_MAX = %I64d",LONG_MAX);
printf("ULONG_MAX = %I64u",ULONG_MAX);
printf("EMPTY_VALUE = %.16e",EMPTY_VALUE);
printf("DBL_MIN = %.16e",DBL_MIN);
printf("DBL_MAX = %.16e",DBL_MAX);
printf("DBL_EPSILON = %.16e",DBL_EPSILON);
printf("DBL_DIG = %d",DBL_DIG);
printf("DBL_MANT_DIG = %d",DBL_MANT_DIG);
printf("DBL_MAX_10_EXP = %d",DBL_MAX_10_EXP);
printf("DBL_MAX_EXP = %d",DBL_MAX_EXP);
printf("DBL_MIN_10_EXP = %d",DBL_MIN_10_EXP);
printf("DBL_MIN_EXP = %d",DBL_MIN_EXP);
printf("FLT_MIN = %.8e",FLT_MIN);
printf("FLT_MAX = %.8e",FLT_MAX);
printf("FLT_EPSILON = %.8e",FLT_EPSILON);
}


Причины деинициализации

Справочник MQL4 / Константы, перечисления и структуры / Именованные константы / Причины деинициализации

Причины деинициализации

Коды причины деинициализации эксперта, возвращаемые функцией UninitializeReason(). Могут иметь любые из следующих значений:

Константа | Значение | Описание
REASON_PROGRAM | 0 | Эксперт прекратил свою работу, вызвав функцию ExpertRemove()
REASON_REMOVE | 1 | Программа удалена с графика
REASON_RECOMPILE | 2 | Программа перекомпилирована
REASON_CHARTCHANGE | 3 | Символ или период графика был изменен
REASON_CHARTCLOSE | 4 | График закрыт
REASON_PARAMETERS | 5 | Входные параметры были изменены пользователем
REASON_ACCOUNT | 6 | Активирован другой счет либо произошло переподключение к торговому серверу вследствие изменения настроек счета
REASON_TEMPLATE | 7 | Применен другой шаблон графика
REASON_INITFAILED | 8 | Признак того, что обработчик OnInit() вернул ненулевое значение
REASON_CLOSE | 9 | Терминал был закрыт

Код причины деинициализации передается также в качестве параметра предопределенной функции OnDeinit(const int reason).

Индикаторы принимают пока только код 1(REASON_REMOVE) и код 2(REASON_RECOMPILE).

Пример:

//+------------------------------------------------------------------+
//| get text description |
//+------------------------------------------------------------------+
string getUninitReasonText(int reasonCode)
{
string text="";
//---
switch(reasonCode)
{
case REASON_ACCOUNT:
text="Account was changed";break;
case REASON_CHARTCHANGE:
text="Symbol or timeframe was changed";break;
case REASON_CHARTCLOSE:
text="Chart was closed";break;
case REASON_PARAMETERS:
text="Input-parameter was changed";break;
case REASON_RECOMPILE:
text="Program "+__FILE__+" was recompiled";break;
case REASON_REMOVE:
text="Program "+__FILE__+" was removed from chart";break;
case REASON_TEMPLATE:
text="New template was applied to chart";break;
default:text="Another reason";
}
//---
return text;
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- Первый способ получить код причины деинициализации
Print(__FUNCTION__,"_Код причины деинициализации = ",reason);
//--- Второй способ получить код причины деинициализации
Print(__FUNCTION__,"_UninitReason = ",getUninitReasonText(_UninitReason));
}


Проверка указателя объекта

Справочник MQL4 / Константы, перечисления и структуры / Именованные константы / Проверка указателя объекта

Проверка указателя объекта

Для проверки типа указателя объекта предназначена функция CheckPointer(), которая возвращает значение из перечисления ENUM_POINTER_TYPE. В случае использования некорректного указателя исполнение программы будет немедленно прервано.

Объекты, созданные оператором new, имеют тип POINTER_DYNAMIC. Только для таких указателей можно и нужно использовать оператор уничтожения delete().

Все остальные указатели имеют тип POINTER_AUTOMATIC, что означает, что данный объект был создан автоматически средой исполнения mql4-программы. Такие объекты уничтожаются после использования также автоматически.

ENUM_POINTER_TYPE

Константа | Описание
POINTER_INVALID | Некорректный указатель
POINTER_DYNAMIC | Указатель объекта, созданного оператором new
POINTER_AUTOMATIC | Указатель любого объекта, созданного автоматически (без использования new())

Смотри также

Ошибки выполнения, Оператор уничтожения объекта delete, CheckPointer()


Прочие константы

Справочник MQL4 / Константы, перечисления и структуры / Именованные константы / Прочие константы

Прочие константы

Специальные константы, используемые для указания состояния параметров и переменных. Mогут быть следующими величинами:

Константа | Описание | Значение
NULL | Ноль любого типа. Также указывает пустое состояние строки | 0
EMPTY | Указывает пустое состояние параметра | -1
EMPTY_VALUE | Пустое значение в индикаторном буфере | 2147483647 (0x7FFFFFFF)
CLR_NONE, clrNONE | Отсутствие цвета. Значение по умолчанию, указатель пустого значения. Используется в пользовательских индикаторах | -1
CHARTS_MAX | Максимально возможное количество одновременно открытых графиков в терминале | 100
INVALID_HANDLE | Некорректный хэндл | -1
IS_DEBUG_MODE | Признак работы mq5-программы в режиме отладки | в режиме отладки не равно нулю, в противном случае 0
IS_PROFILE_MODE | Признак работы mq5-программы в режиме профилирования | в режиме профилирования не равно нулю, в противном случае 0
WHOLE_ARRAY | Означает количество элементов, оставшееся до конца массива, то есть, будет обработан весь массив | 0
WRONG_VALUE | Константа может неявно приводиться к типу любого перечисления | -1

Константа NULL может быть присвоена переменной любого простого типа или указателю на объект структуры или класса. Присвоение NULL строковой переменной означает полную деинициализацию этой переменной.

Константа EMPTY_VALUE обычно соответствует тем значениям индикаторов, которые не отрисовываются на графике. Например, для встроенного индикатора Standard Deviation с периодом 20 не выводится на график линия для первых в истории 19 баров.

Константа CLR_NONE служит для указания отсутствия цвета, то есть графический объект или графическая серия индикатора не будут отображены. Эта константа не вошла в список констант с наименованиями Web-цветов, но может применяться везде, где требуется указание цвета.

Константа INVALID_HANDLE может использоваться при проверке файловых хэндлов (см. функции FileOpen() и FileFindFirst()).

Константа WRONG_VALUE предназначена для тех случаев, когда требуется вернуть значение перечисления, и это должно быть неверное значение. Например, нужно сообщить, что возвращаемое значение является значением этого перечисления. Приведем в качестве иллюстрации некую функцию CheckLineStyle(), которая возвращает стиль линии для объекта, указанного по имени. Если при запросе стиля функцией ObjectGetInteger() результатом будет true, то вернется значение перечисления ENUM_LINE_STYLE, иначе возвращается WRONG_VALUE.

void OnStart()
{
if(CheckLineStyle("MyChartObject")==WRONG_VALUE)
printf("Error line style getting.");
}
//+------------------------------------------------------------------+
//| возвращает стиль линии для объекта, указанного по имени |
//+------------------------------------------------------------------+
ENUM_LINE_STYLE CheckLineStyle(string name)
{
long style;
//---
if(ObjectGetInteger(0,name,OBJPROP_STYLE,0,style))
return((ENUM_LINE_STYLE)style);
else
return(WRONG_VALUE);
}

Константа WHOLE_ARRAY предназначена для функций, которые требуют указания количества элементов в обрабатываемых массивах:

  • ArrayCopy();
  • ArrayMinimum();
  • ArrayMaximum();
  • FileReadArray();
  • FileWriteArray().

Если требуется указать, что необходимо обработать все значения массива с указанной позиции и до конца, то достаточно указать значение WHOLE_ARRAY.

Константа IS_PROFILE_MODE позволяет изменить работу программы для корректного сбора информации в режиме профилирования. Профилирование позволяет замерить время выполнения отдельных фрагментов программы (обычно это функции), а также подсчитать количество таких вызовов. Для корректного получения информации о времени выполнения в режиме профилировки можно отключить вызовы функции Sleep() как в примере:

//--- Sleep может сильно повлиять(исказить) на результат профилировки
if(!IS_PROFILE_MODE) Sleep(100); // запрещаем вызов Sleep() в режиме профилировки

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

Константа IS_DEBUG_MODE пригодится в тех случаях, когда необходимо немного изменить работу mql4-программы в режиме отладки. Например, в режиме отладки может потребоваться выводить дополнительную отладочную информацию в лог терминала или создавать вспомогательные графические объекты на графике.

Приведенный ниже пример создает объект Label и задает ее описание и цвет в зависимости от того, в каком режиме выполняется скрипт. Для того чтобы запустить скрипт в режиме отладки из MetaEditor, нажмите клавишу F5. Если запустить скрипта из окна навигатора в терминале, то цвет и текст объекта Label будут другими.

Пример:

//+------------------------------------------------------------------+
//| Check_DEBUG_MODE.mq5 |
//| Copyright © 2009, MetaQuotes Software Corp. |
//| https://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
string label_name="invisible_label";
if(ObjectFind(0,label_name)<0)
{
Print("Object ",label_name," not found. Error code = ",GetLastError());
//--- создадим объект Label
ObjectCreate(0,label_name,OBJ_LABEL,0,0,0);
//--- установим координату X
ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,200);
//--- установим координату Y
ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,300);
ResetLastError();
if(IS_DEBUG_MODE) // режим отладки
{
//--- выведем сообщение о режиме выполнения скрипта
ObjectSetString(0,label_name,OBJPROP_TEXT,"DEBUG MODE");
//--- зададим красный цвет текста
if(!ObjectSetInteger(0,label_name,OBJPROP_COLOR,clrRed))
Print("Не удалось установить цвет. Ошибка ",GetLastError());
}
else // рабочий режим
{
ObjectSetString(0,label_name,OBJPROP_TEXT,"RELEASE MODE");
//--- зададим невидимый цвет текста
if(!ObjectSetInteger(0,label_name,OBJPROP_COLOR,CLR_NONE))
Print("Не удалось установить цвет. Ошибка ",GetLastError());
}
ChartRedraw();
DebugBreak(); // здесь произойдет прерывание, если мы в режиме отладки
}
}

Методы шифрования данных

Для указания метода преобразования данных (шифрование и расчет хешей) в функциях CryptEncode() и CryptDecode() используется перечисление ENUM_CRYPT_METHOD.

ENUM_CRYPT_METHOD

Константа | Описание
CRYPT_BASE64 | Шифрование BASE64 (перекодировка)
CRYPT_AES128 | Шифрование AES с ключом 128 бит (16 байт)
CRYPT_AES256 | Шифрование AES с ключом 256 бит (32 байта)
CRYPT_DES | Шифрование DES с ключом 56 бит (7 байт)
CRYPT_HASH_SHA1 | Расчёт HASH SHA1
CRYPT_HASH_SHA256 | Расчёт HASH SHA256
CRYPT_HASH_MD5 | Расчёт HASH MD5
CRYPT_ARCH_ZIP | ZIP архивирование

Смотри также

DebugBreak, Информация о запущенной MQL4-программе, CryptEncode(), CryptDecode()


Структуры данных

Справочник MQL4 / Константы, перечисления и структуры / Структуры данных

Структуры данных

В MQL4 существуют 8 предопределенных структур, предназначенные для хранения и передачи служебной информации:

  • MqlDateTime предназначена для представления даты и времени;
  • MqlRates предоставляет информацию об исторических данных, содержащих цену, объем и спред;
  • MqlTick предназначена для быстрого получения наиболее востребованной информации о текущих ценах.

Что нового в MQL5

В платформе пятого поколения был существенно расширен торговый функционал – стала возможна работа с тиками и стаканом цен, расширены свойства ордеров и торгового запроса, добавлена обработка торговых событий, появились функции Экономического календаря. Для передачи и обработки всей этой обширной информации были добавлены новые структуры для хранения данных:

  • MqlParam предназначена для описания входных параметров при создании индикатора с помощью функции IndicatorCreate();
  • MqlRates предоставляет информацию об исторических данных, содержащих цену, объем и спред;
  • MqlBookInfo для получения информации из стакана цен (окно котировок);
  • MqlTick предназначена для быстрого получения наиболее востребованной информации о текущих ценах;
  • MqlTradeRequest используется для отравки торгового запроса;
  • MqlTradeCheckResult содержит результат проверки торгового запроса перед его отправкой;
  • MqlTradeResult возвращает ответ торгового сервера на торговый запрос;
  • MqlTradeTransaction дает описание полученной транзакции;
  • Структуры Экономического календаря предназначены для получения новостей и актуальных макроэкономических показателей, которые поступают прямо в платформу.


Структура даты

Справочник MQL4 / Константы, перечисления и структуры / Структуры данных / Структура даты

MqlDateTime

Структура даты содержит в себе восемь полей типа int.

struct MqlDateTime
{
int year; // год
int mon; // месяц
int day; // день
int hour; // час
int min; // минуты
int sec; // секунды
int day_of_week; // день недели (0-воскресенье, 1-понедельник, ... ,6-суббота)
int day_of_year; // порядковый номер в году (1 января имеет номер 0)
};

Примечание

Порядковый номер в году day_of_year в високосном году, начиная с марта, будет отличаться от порядкового номера соответствующего дня в невисокосном году.

Пример:

void OnStart()
{
//---
datetime date1=D'2008.03.01';
datetime date2=D'2009.03.01';

MqlDateTime str1,str2;
TimeToStruct(date1,str1);
TimeToStruct(date2,str2);
printf("%02d.%02d.%4d, day of year = %d",str1.day,str1.mon,
str1.year,str1.day_of_year);
printf("%02d.%02d.%4d, day of year = %d",str2.day,str2.mon,
str2.year,str2.day_of_year);
}
/* Результат
01.03.2008, day of year = 60
01.03.2009, day of year = 59
*/

Смотри также

TimeToStruct, Структуры и классы


Структура исторических данных

Справочник MQL4 / Константы, перечисления и структуры / Структуры данных / Структура исторических данных

MqlRates

Структура для хранения информации о ценах, объемах и спреде.

struct MqlRates
{
datetime time; // время начала периода
double open; // цена открытия
double high; // наивысшая цена за период
double low; // наименьшая цена за период
double close; // цена закрытия
long tick_volume; // тиковый объем
int spread; // спред
long real_volume; // биржевой объем
};

Пример:

void OnStart()
{
MqlRates rates[];
int copied=CopyRates(NULL,0,0,100,rates);
if(copied<=0)
Print("Ошибка копирования ценовых данных ",GetLastError());
else Print("Скопировано ",ArraySize(rates)," баров");
}

Смотри также

CopyRates, Доступ к таймсериям


MqlTick

Справочник MQL4 / Константы, перечисления и структуры / Структуры данных / Структура для получения текущих цен

Структура для получения текущих цен (MqlTick)

Структура для хранения последних цен по символу. Предназначена для быстрого получения наиболее востребованной информации о текущих ценах.

struct MqlTick
{
datetime time; // Время последнего обновления цен
double bid; // Текущая цена Bid
double ask; // Текущая цена Ask
double last; // Текущая цена последней сделки (Last)
ulong volume; // Объем для текущей цены Last
};

Переменная типа MqlTick позволяет за один вызов функции SymbolInfoTick() получить значения Ask, Bid, Last и Volume.

Пример:

void OnTick()
{
MqlTick last_tick;
//---
if(SymbolInfoTick(Symbol(),last_tick))
{
Print(last_tick.time,": Bid = ",last_tick.bid,
" Ask = ",last_tick.ask," Volume = ",last_tick.volume);
}
else Print("SymbolInfoTick() failed, error = ",GetLastError());
//---
}

Смотри также

Структуры и классы


Коды ошибок и предупреждений

Справочник MQL4 / Константы, перечисления и структуры / Коды ошибок и предупреждений

Коды ошибок и предупреждений

Раздел содержит следующие описания:

  • Коды возврата торгового сервера – анализ результатов отправки торгового запроса, отправленного функцией OrderSend();
  • Предупреждения компилятора – коды предупредительных сообщений, выводимые при компиляции (не являются ошибками);
  • Ошибки компиляции – коды сообщений об ошибке при неудачной попытке компиляции;
  • Ошибки времени выполнения – коды ошибок при выполнении mql4-программы, которые можно получить при помощи функции GetLastError().


Коды возврата торгового сервера

Справочник MQL4 / Константы, перечисления и структуры / Коды ошибок и предупреждений / Коды возврата торгового сервера

Коды возврата торгового сервера

GetLastError() - функция, возвращающая коды ошибок. Кодовые константы ошибок определены в файле stderror.mqh. Для вывода текстовых сообщений следует использовать функцию ErrorDescription(), определенную в файле stdlib.mqh.

Пример:

#include <stderror.mqh>
#include <stdlib.mqh>
void SendMyMessage(string text)
{
int check;
SendMail("Test", text);
check=GetLastError();
if(check!=ERR_NO_ERROR) Print("Сообщение не отправлено. Ошибка: ",ErrorDescription(check));
}

Код | Константа | Описание
0 | ERR_NO_ERROR | Нет ошибки
1 | ERR_NO_RESULT | Нет ошибки, но результат неизвестен
2 | ERR_COMMON_ERROR | Общая ошибка
3 | ERR_INVALID_TRADE_PARAMETERS | Неправильные параметры
4 | ERR_SERVER_BUSY | Торговый сервер занят
5 | ERR_OLD_VERSION | Старая версия клиентского терминала
6 | ERR_NO_CONNECTION | Нет связи с торговым сервером
7 | ERR_NOT_ENOUGH_RIGHTS | Недостаточно прав
8 | ERR_TOO_FREQUENT_REQUESTS | Слишком частые запросы
9 | ERR_MALFUNCTIONAL_TRADE | Недопустимая операция, нарушающая функционирование сервера
64 | ERR_ACCOUNT_DISABLED | Счет заблокирован
65 | ERR_INVALID_ACCOUNT | Неправильный номер счета
128 | ERR_TRADE_TIMEOUT | Истек срок ожидания совершения сделки
129 | ERR_INVALID_PRICE | Неправильная цена
130 | ERR_INVALID_STOPS | Неправильные стопы
131 | ERR_INVALID_TRADE_VOLUME | Неправильный объем
132 | ERR_MARKET_CLOSED | Рынок закрыт
133 | ERR_TRADE_DISABLED | Торговля запрещена
134 | ERR_NOT_ENOUGH_MONEY | Недостаточно денег для совершения операции
135 | ERR_PRICE_CHANGED | Цена изменилась
136 | ERR_OFF_QUOTES | Нет цен
137 | ERR_BROKER_BUSY | Брокер занят
138 | ERR_REQUOTE | Новые цены
139 | ERR_ORDER_LOCKED | Ордер заблокирован и уже обрабатывается
140 | ERR_LONG_POSITIONS_ONLY_ALLOWED | Разрешена только покупка
141 | ERR_TOO_MANY_REQUESTS | Слишком много запросов
145 | ERR_TRADE_MODIFY_DENIED | Модификация запрещена, так как ордер слишком близок к рынку
146 | ERR_TRADE_CONTEXT_BUSY | Подсистема торговли занята
147 | ERR_TRADE_EXPIRATION_DENIED | Использование даты истечения ордера запрещено брокером
148 | ERR_TRADE_TOO_MANY_ORDERS | Количество открытых и отложенных ордеров достигло предела, установленного брокером
149 | ERR_TRADE_HEDGE_PROHIBITED | Попытка открыть противоположный ордер в случае, если хеджирование запрещено
150 | ERR_TRADE_PROHIBITED_BY_FIFO | Попытка закрыть позицию по инструменту в противоречии с правилом FIFO


Предупреждения компилятора

Справочник MQL4 / Константы, перечисления и структуры / Коды ошибок и предупреждений / Предупреждения компилятора

Предупреждения компилятора

Предупреждения компилятора носят информационный характер и не являются сообщениями об ошибках.

Номер | Описание
21 | Неполная запись даты в строке datetime
22 | Ошибочные числа в строке datetime для даты, требования: год 1970<=X<=3000 месяц 0<X<=12 день 0<X<= 31/30/28(29)....
23 | Ошибочные числа в строке datetime для времени, требования: час 0<=X<24 минута 0<=X<60
24 | Некорректный цвет в формате RGB: одна из компонент RGB меньше 0 или больше 255
25 | Неизвестный символ эскейп последовательности. Известные: \n \r \t \\ \" \' \X \x
26 | Слишком большой объем локальных переменных (>512кб) функции, уменьшите их количество
29 | Перечисление уже определено (дублирование) – члены будут добавлены к первому определению
30 | Переопределение макроса
31 | Переменная объявлена, но нигде не используется
32 | Конструктор должен иметь тип void
33 | Деструктор должен иметь тип void
34 | Константа не вмещается в диапазон целых (X>_UI64_MAX || X<_I64_MIN) и будет преобразована в тип double
35 | Слишком длинный HEX больше 16 значащих символов (обрезаются старшие полубайты)
36 | Нет ни одного полубайта в HEX строке "0x"
37 | Нет ни одной функции - нечего будет выполнять
38 | Используется неинициализированная переменная
41 | Функция не имеет тела, но и не вызывается
43 | Возможны потери данных при преобразовании типа. Пример: int x=(double)z;
44 | Потеря точности(данных) при преобразовании константы. Пример: int x=M_PI
45 | Несовпадение знаков операндов в операциях сравнения. Пример: (char)c1>(uchar)c2
46 | Проблемы с импортом функций – требуется объявление #import либо импорт функций уже закрыт
47 | Описание слишком большое – лишние символы не будут включены в исполняемый файл
48 | Количество индикаторных буферов объявлено меньше, чем требуется
49 | Не указан цвет для отрисовки графической серии в индикаторе
50 | Нет ни одной графической серии для отображения индикатора
51 | Не обнаружена функция-обработчик 'OnStart" в скрипте
52 | Функция-обработчик 'OnStart" определена с неверными параметрами
53 | Функция 'OnStart' может быть определена только в скрипте
54 | Функция 'OnInit' определена с неверными параметрами
55 | Функция 'OnInit' не используется в скриптах
56 | Функция 'OnDeinit' определена с неверными параметрами
57 | Функция 'OnDeinit' не используется в скриптах
58 | Определены две функции 'OnCalculate'. Будет использована OnCalculate() на одном ценовом массиве
59 | Обнаружено переполнение при вычислении сложной целочисленной константы
60 | Возможно, переменная неинициализирована.
61 | Данное объявление делает недоступным обращение к локальной переменной, объявленной на указанной строке
62 | Данное объявление делает недоступным обращение к глобальной переменной, объявленной на указанной строке
63 | Не может быть использовано для статических массивов
64 | Данное объявление делает недоступным обращение к предопределенной переменной
65 | Значение выражения всегда true/false
66 | Использование переменной или выражения типа bool в математических операциях является небезопасным
67 | Результат применения оператора унарного минуса к беззнаковому типу ulong неопределен
68 | Версия, указанная в свойстве #property version, недопустима для размещения в разделе Маркет, правильный формат #property version "XXX.YYY"
69 | Отсутствует выражение для выполнения по условию
70 | Неверный возвращаемый тип функции или некорректные параметры при объявлении функции-обработчика события
71 | Требуется явное приведение структур к одному типу
72 | Данное объявление делает недоступным прямое обращение к члену класса, объявленному на указанной строке. Доступ будет возможен только с помощью операции разрешения контекста ::
73 | Константа в двоичной записи слишком велика, старшие разряды будут отброшены
74 | Параметр в методе наследуемого класса отличается модификатором const, дочерняя функция перегрузила функцию родителя
75 | Отрицательное или слишком большое значения смещения в битовой операции сдвига, результат выполнения неопределён
76 | Функция должна вернуть значение
77 | Функция типа void не должна возвращать значение
78 | Не все варианты выполнения возвращают значение
79 | Выражения на глобальном уровне не разрешены
80 | Возможна ошибка в последовательности выполнения операций, используйте скобки для явного указания порядка
81 | Найдено два вида вызова OnCalCulate(). Вызываться будет вариант с использованием таймсерий OHLC
82 | Структура не содержит членов, размер будет приравнен 1 байту
83 | Нет обработки результата выполнения функции
84 | Индикатор, включаемый как ресурс, скомпилирован в режиме отладки. Это снижает его производительность. Для повышения скорости работы его нужно перекомпилировать
85 | Слишком большой код символа в строке, должен быть в диапазоне от 0 до 65535
86 | Нераспознанный служебный символ в строке
87 | Не указано свойство индикатора, задающее вывод в главное окно или в отдельное подокно. Будет применено свойство #property indicator_chart_window
88 | Свойство проигнорировано, оно должно быть объявлено на глобальном уровне. Не генерируется для свойств copyright, link, version и strict.


Ошибки компиляции

Справочник MQL4 / Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции

Ошибки компиляции

MetaEdtior редактор mql4-программ, выдает сообщения об ошибках программы, обнаруженных встроенным компилятором на стадии компиляции. Список этих ошибок приведен ниже в таблице. Для компиляции исходного кода в исполняемый нажмите F7. Программы с ошибками не могут быть скомпилированы, пока ошибки, указанные компилятором, не будут устранены.

Номер | Описание
100 | Ошибка чтения файла
101 | Ошибка открытия *.EX4 файла для записи
103 | Недостаточно свободной памяти для завершения компиляции
104 | Нераспознанная компилятором пустая синтаксическая единица
105 | Некорректное имя файла в #include
106 | Ошибка доступа к файлу в #include (возможно файл не существует)
108 | Неподходящее имя для #define
109 | Неизвестная команда препроцессора (допустимы #include,#define,#property,#import)
110 | Неизвестный для компилятора символ
111 | Функция не реализована (описание есть, тела нет)
112 | Пропущена двойная кавычка (")
113 | Пропущена открывающая угловая скобка (<) или двойная кавычка (")
114 | Пропущена одинарная кавычка (')
115 | Пропущена закрывающая угловая скобка ">"
116 | Не указан тип в объявлении
117 | Нет оператора возврата return или имеется не во всех ветках выполнения
118 | Ожидалась открывающая скобка параметров вызова
119 | Ошибка записи EX4
120 | Некорректный доступ к элементу массива
121 | Функция не имеет тип void и оператор return должен вернуть значение
122 | Некорректное объявление деструктора
123 | Отсутствует двоеточие ":"
124 | Переменная уже объявлена
125 | Переменная с таким идентификатором уже объявлена
126 | Имя переменной слишком длинное (>250 символов)
127 | Структура с таким идентификатором уже определена
128 | Структура не определена
129 | Член структуры с таким именем уже определен
130 | Нет такого члена структуры
131 | Нарушена парность квадратных скобок
132 | Ожидается открывающая круглая скобка "("
133 | Несбалансированные фигурные скобки ( отсутствует "}" )
134 | Сложно для компиляции (слишком большое ветвление, внутренний стек уровней переполнен)
135 | Ошибка открытия файла на чтение
136 | Недостаточно памяти для загрузки исходного файла в память
137 | Ожидается переменная
138 | Ссылка не может быть инициализирована
140 | Ожидалось присваивание (возникает при объявлении)
141 | Ожидается открывающая фигурная скобка "{"
142 | Параметр может быть только динамическим массивом
143 | Использование типа "void" недопустимо
144 | Нет пары для ")" или "]", т.е. отсутствует "(" или "["
145 | Нет пары для "(" или "[", т.е. отсутствует ")" или "]"
146 | Некорректная размерность массива
147 | Слишком много параметров (>64)
149 | Этот токен тут не ожидается
150 | Недопустимое использование операции (неправильные операнды)
151 | Выражение типа void недопустимо
152 | Ожидается оператор
153 | Неправильное использование break
154 | Ожидается точка с запятой ";"
155 | Ожидается запятая ","
156 | Тип должен быть определен как класс, а не как структура
157 | Ожидалось выражение
158 | В HEX встречается "не HEX символ" или слишком длинное число (количество цифр > 511)
159 | Строка-константа имеет более 65534 символов
160 | Определение функции здесь недопустимо
161 | Неожиданный конец программы
162 | Форвардная декларация для структур запрещена
163 | Функция с таким именем уже определена и имеет иной тип возвращаемого значения
164 | Функция с таким именем уже определена и имеет иной набор параметров
165 | Функция с таким именем уже определена и реализована
166 | Перегрузка функции для данного вызова не найдена
167 | Функция с возвращаемым значением типа void не может возвращать значение
168 | Функция не определена
170 | Ожидается значение
171 | В выражении case допустимы только целочисленные константы
172 | Значение для case в этом switch уже использовано
173 | Ожидается целочисленное значение
174 | В выражении #import ожидается имя файла
175 | Выражения на глобальном уровне не допустимы
176 | Пропущена круглая скобка ")" перед ";"
177 | Слева от знака равенства предполагается переменная
178 | Результат выражения не используется
179 | Объявление переменных в case недопустимо
180 | Неявное преобразование из строки в число
181 | Неявное преобразование числа в строку
182 | Неоднозначный вызов перегруженной функции (подходят несколько перегрузок)
183 | Недопустимый else без соответствующего if
184 | Недопустимый case или default без соответствующего switch
185 | Недопустимое использование эллипсиса
186 | Инициализирующая последовательность имеет большее количество элементов чем инициализируемая переменная
187 | Ожидается константа для case
188 | Требуется константное выражение
189 | Константная переменная не может быть изменена
190 | Ожидается закрывающая скобка или запятая (объявление члена массива)
191 | Идентификатор перечисления уже используется
192 | Перечисление не может иметь модификаторов доступа (const, extern, static)
193 | Член перечисления уже объявлен с другим значением
194 | Существует переменная, определенная с таким же именем
195 | Существует структура, определенная с таким же именем
196 | Ожидается имя члена перечисления
197 | Ожидается целочисленное выражение
198 | Деление на ноль в константном выражении
199 | Неверное количество параметров в функции
200 | Параметром по ссылке должна быть переменная
201 | Ожидается переменная такого же типа для передачи по ссылке
202 | Константная переменная не может быть передана по неконстантной ссылке
203 | Требуется целочисленная положительная константа
204 | Ошибка доступа к защищенному члену класса
205 | Импорт уже определен по другому пути
208 | Исполняемый файл не создан
209 | Для индикатора не найдена точка входа 'OnCalculate'
210 | Оператор continue может быть использован только внутри цикла
211 | Ошибка доступа к private(закрытому) члену класса
213 | Метод структуры или класса не объявлен
214 | Ошибка доступа к private(закрытому) методу класса
216 | Копирование структур с объектами недопустимо
218 | Выход индекса за границы массива
219 | Недопустима инициализация массивов в объявлении структуры или класса
220 | Конструктор класса не может иметь параметров
221 | Деструктор класса не может иметь параметров
222 | Метод класса или структуры с таким именем и параметрами уже объявлен
223 | Ожидается операнд
224 | Метод класса или структуры с таким именем есть, но с другими параметрами (объявление!=реализация)
225 | Импортируемая функция не описана
226 | Функция ZeroMemory() не применима для классов с защищенными членами или наследованием
227 | Неоднозначный вызов перегруженной функции (точное совпадение параметров для нескольких перегрузок)
228 | Ожидается имя переменной
229 | Ссылку нельзя объявить в этом месте
230 | Уже используется в качестве имени перечисления
232 | Ожидается класс или структура
235 | Нельзя вызывать delete для удаления массива
236 | Ожидается оператор ' while '
237 | В delete должен быть указатель
238 | default для этого switch уже есть
239 | Синтаксическая ошибка
240 | Escape-последовательность может встретиться только в строках ( начинается с '\' )
241 | Требуется массив – квадратная скобка '[' не относится к массиву либо в качестве параметра-массива подают не массив
242 | Не может быть инициализировано посредством инициализирующей последовательности
243 | Импорт не определен
244 | Ошибка оптимизатора на синтаксическом дереве
245 | Объявлено слишком много структур (упростите программу)
246 | Преобразование параметра недопустимо
247 | Некорректное использование оператора delete
248 | Нельзя объявить указатель на ссылку
249 | Нельзя объявить ссылку на ссылку
250 | Нельзя объявить указатель на указатель
251 | Недопустимо объявление структуры в списке параметров
252 | Недопустимая операция приведения типов
253 | Указатель можно объявить только для класса или структуры
256 | Необъявленный идентификатор
257 | Ошибка оптимизатора исполняемого кода
258 | Ошибка генерации исполняемого кода
260 | Недопустимое выражение для оператора switch
261 | Переполнение пула строковых констант, упростите программу
262 | Невозможно преобразовать к перечислению
263 | Нельзя использовать virtual для данных (членов класса или структуры)
264 | Нельзя вызвать защищенный метод класса
265 | Переопределяемая виртуальная функция возвращает другой тип
266 | Класс нельзя наследовать от структуры
267 | Структуру нельзя наследовать от класса
268 | Конструктор не может быть виртуальным (спецификатор virtual недопустим)
269 | Структура не может иметь виртуальных методов
270 | Функция должна иметь тело
271 | Перегрузка системных функций (функций терминала) запрещена
272 | Спецификатор const недопустим для функций, не являющихся членом класса или структуры
274 | Нельзя менять члены класса в константном методе
276 | Неподходящая инициализирующая последовательность
277 | Пропущено значение по умолчанию для параметра (специфика объявления параметров по умолчанию)
278 | Переопределение параметра по умолчанию (в объявлении и реализации разные значения)
279 | Нельзя вызвать неконстантный метод для константного объекта
280 | Для доступа к членам требуется объект (поставлена точка для не класса/структуры)
281 | Имя уже объявленной структуры нельзя использовать при объявлении
284 | Неразрешенное преобразование (при закрытом наследовании)
285 | Структуры и массивы не могут быть использованы в качестве input-переменных
286 | Спецификатор const недопустим для конструктора/деструктора
287 | Неправильное строковое выражение для типа datetime
288 | Неизвестное свойство (#property)
289 | Некорректное значение для свойства
290 | Некорректный индекс для свойства в #property
291 | Пропущен параметр вызова – < func(x,) >
293 | Объект должен быть передан по ссылке
294 | Массив должен быть передан по ссылке
295 | Функция была декларирована как экспортируемая
296 | Функция не была декларирована как экспортируемая
297 | Экспортировать импортируемую функцию нельзя
298 | Импортируемая функция не может иметь такого параметра (нельзя передавать указатель, класс или структуру, содержащую динамический массив, указатель, класс и т.д.)
299 | Должен быть класс
300 | Секция #import не закрыта
302 | Несоответствие типов
303 | extern-переменная уже инициализирована
304 | Не найдено ни одной экспортируемой функции или стандартной точки входа
305 | Явный вызов конструктора запрещен
306 | Метод был объявлен константным
307 | Метод не был объявлен константным
308 | Некорректный размер ресурсного файла
309 | Некорректное имя ресурса
310 | Ошибка открытия файла ресурса
311 | Ошибка чтения файла ресурса
312 | Неизвестный тип ресурса
313 | Некорректный путь к файлу ресурса
314 | Указанное имя ресурса уже используется
315 | Ожидались параметры макроса
316 | После имени макроса должен быть пробел
317 | Ошибка в описании параметров макроса
318 | Неверное число параметров при использовании макроса
319 | Превышение максимального количества(16) параметров для макроса
320 | Макрос слишком сложный, требуется упрощение
321 | Параметром EnumToString() может быть только перечисление
322 | Имя ресурса слишком длинное
323 | Неподдерживаемый формат изображения (допустим только BMP-формат с глубиной цвета 24 или 32 бита)
324 | Объявление массива внутри оператора запрещено
325 | Функцию можно определить только на глобальном уровне
326 | Данное объявление недопустимо для текущей области видимости (области определения)
327 | Инициализация статичных переменных значениями локальных недопустима
328 | Недопустимое объявление массива объектов, не имеющих конструктора по умолчанию
329 | Список инициализации разрешен только для конструкторов
330 | Отсутствует определение функции после списка инициализации
331 | Список инициализации пуст
332 | Инициализация массива в конструкторе запрещена
333 | В списке инициализации запрещено инициализировать члены родительского класса
334 | Ожидалось выражение целого типа
335 | Требуемый объем памяти для массива превышает максимально допустимое значение
336 | Требуемый объем памяти для структуры превышает максимально допустимое значение
337 | Требуемый объем памяти для переменных, объявленных на глобальном уровне, превышает максимально допустимое значение
338 | Требуемый объем памяти для локальных переменных превышает максимально допустимое значение
339 | Конструктор не определен
340 | Недопустимое имя для файла иконки
341 | Не удалось открыть файла иконки по указанному пути
342 | Файл иконки некорректен и не соответствует формату ICO
343 | Повторная инициализация члена в конструкторе класса/структуры с помощью списка инициализации
344 | Инициализация статических членов в списке инициализации конструктора не допускается
345 | Инициализация нестатического члена класса/структуры на глобальном уровне запрещена
346 | Имя метода класса/структуры совпадает с ранее объявленным именем члена
347 | Имя члена класса/структуры совпадает с ранее объявленным именем метода
348 | Виртуальная функция не может быть объявлена как static
349 | Модификатор const недопустим для статической функции
350 | Конструктор или деструктор не могут быть статическими
351 | Нельзя обращаться к нестатическому члену/методу класса или структуры из статической функции
352 | После ключевого слова operator ожидается перегружаемая операция (+,-,[],++,-- и т.д.)
353 | Не все операции можно перегружать в MQL4
354 | Определение не соответствует объявлению
355 | Указано неверное количество параметров для оператора
356 | Не обнаружено ни одной функции-обработчика события
357 | Методы не могут быть экспортируемыми
358 | Нельзя приводить указатель на константный объект к указателю на неконстантный объект
359 | Шаблоны классов пока не поддерживаются
360 | Перегрузка шаблонов функций пока не поддерживается
361 | Невозможно применить шаблон функции
362 | Неоднозначный параметр в шаблоне функции (подходят несколько типов параметра)
363 | Невозможно определить к какому типу параметра приводить аргумент шаблона функции
364 | Неверное количество параметров в шаблоне функции
365 | Шаблон функции не может быть виртуальным
366 | Шаблоны функций не могут быть экспортированы
367 | Нельзя импортировать шаблоны функций
368 | Cтруктуры, содержащие объекты, недопустимы
369 | Массивы строк и структуры, содержащие объекты, недопустимы
370 | Статический член класса/структуры должен быть явно инициализирован
371 | Ограничение компилятора: строка не может содержать более 65 535 символов
372 | Несогласованные #ifdef/#endif
373 | Результатом выполнения функции не может быть объект класса, так как отсутствует конструктор копирования
374 | Нельзя использовать нестатические члены и/или методы при инициализации статической переменной
375 | OnTesterInit() нельзя использовать без объявления обработчика OnTesterDeinit()
376 | Имя локальной переменной совпадает с именем одного из параметров функции
377 | Нельзя использовать макросы __FUNCSIG__ и __FUNCTION__ вне тела функции
378 | Недопустимый возвращаемый тип. Например, такая ошибка будет выдана для функций, импортированных из DLL, которые возвращают структуру или указатель в качестве результата
379 | Ошибка при использовании шаблона
380 | Не используется
381 | Недопустимый синтаксис при объявлении чисто виртуальной функции, разрешено "=NULL" или "=0"
382 | Только виртуальные функции могут быть объявлены со спецификатором чисто виртуальной функции ("=NULL" или "=0")
383 | Нельзя создать экземпляр абстрактного класса
384 | Для динамического приведения с помощью оператора dynamic_cast типом назначения должен быть указатель на пользовательский тип
385 | Ожидается тип "указатель на функцию"
386 | Указатели на методы не поддерживаются
387 | Ошибка – невозможно определить тип указателя на функцию
388 | Приведение типа недоступно из-за закрытого наследования
389 | Переменная с модификатором const должна быть проинициализирована при объявлении


Ошибки времени выполнения

Справочник MQL4 / Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения

Ошибки времени выполнения

GetLastError() – функция, возвращающая код последней ошибки, которая хранится в предопределенной переменной _LastError. Значение этой переменной можно сбросить в ноль функцией ResetLastError().

Коды торговых ошибок для удобства дополнительно приведены отдельным списком в разделе Коды возврата торгового сервера.

Коды ошибок выполнения MQL4-программы:

Код | Константа | Описание
0 | ERR_NO_ERROR | Нет ошибки
1 | ERR_NO_RESULT | Нет ошибки, но результат неизвестен
2 | ERR_COMMON_ERROR | Общая ошибка
3 | ERR_INVALID_TRADE_PARAMETERS | Неправильные параметры
4 | ERR_SERVER_BUSY | Торговый сервер занят
5 | ERR_OLD_VERSION | Старая версия клиентского терминала
6 | ERR_NO_CONNECTION | Нет связи с торговым сервером
7 | ERR_NOT_ENOUGH_RIGHTS | Недостаточно прав
8 | ERR_TOO_FREQUENT_REQUESTS | Слишком частые запросы
9 | ERR_MALFUNCTIONAL_TRADE | Недопустимая операция, нарушающая функционирование сервера
64 | ERR_ACCOUNT_DISABLED | Счет заблокирован
65 | ERR_INVALID_ACCOUNT | Неправильный номер счета
128 | ERR_TRADE_TIMEOUT | Истек срок ожидания совершения сделки
129 | ERR_INVALID_PRICE | Неправильная цена
130 | ERR_INVALID_STOPS | Неправильные стопы
131 | ERR_INVALID_TRADE_VOLUME | Неправильный объем
132 | ERR_MARKET_CLOSED | Рынок закрыт
133 | ERR_TRADE_DISABLED | Торговля запрещена
134 | ERR_NOT_ENOUGH_MONEY | Недостаточно денег для совершения операции
135 | ERR_PRICE_CHANGED | Цена изменилась
136 | ERR_OFF_QUOTES | Нет цен
137 | ERR_BROKER_BUSY | Брокер занят
138 | ERR_REQUOTE | Новые цены
139 | ERR_ORDER_LOCKED | Ордер заблокирован и уже обрабатывается
140 | ERR_LONG_POSITIONS_ONLY_ALLOWED | Разрешена только покупка
141 | ERR_TOO_MANY_REQUESTS | Слишком много запросов
145 | ERR_TRADE_MODIFY_DENIED | Модификация запрещена, так как ордер слишком близок к рынку
146 | ERR_TRADE_CONTEXT_BUSY | Подсистема торговли занята
147 | ERR_TRADE_EXPIRATION_DENIED | Использование даты истечения ордера запрещено брокером
148 | ERR_TRADE_TOO_MANY_ORDERS | Количество открытых и отложенных ордеров достигло предела, установленного брокером
149 | ERR_TRADE_HEDGE_PROHIBITED | Попытка открыть противоположный ордер в случае, если хеджирование запрещено
150 | ERR_TRADE_PROHIBITED_BY_FIFO | Попытка закрыть позицию по инструменту в противоречии с правилом FIFO
4000 | ERR_NO_MQLERROR | Нет ошибки
4001 | ERR_WRONG_FUNCTION_POINTER | Неправильный указатель функции
4002 | ERR_ARRAY_INDEX_OUT_OF_RANGE | Индекс массива - вне диапазона
4003 | ERR_NO_MEMORY_FOR_CALL_STACK | Нет памяти для стека функций
4004 | ERR_RECURSIVE_STACK_OVERFLOW | Переполнение стека после рекурсивного вызова
4005 | ERR_NOT_ENOUGH_STACK_FOR_PARAM | На стеке нет памяти для передачи параметров
4006 | ERR_NO_MEMORY_FOR_PARAM_STRING | Нет памяти для строкового параметра
4007 | ERR_NO_MEMORY_FOR_TEMP_STRING | Нет памяти для временной строки
4008 | ERR_NOT_INITIALIZED_STRING | Неинициализированная строка
4009 | ERR_NOT_INITIALIZED_ARRAYSTRING | Неинициализированная строка в массиве
4010 | ERR_NO_MEMORY_FOR_ARRAYSTRING | Нет памяти для строкового массива
4011 | ERR_TOO_LONG_STRING | Слишком длинная строка
4012 | ERR_REMAINDER_FROM_ZERO_DIVIDE | Остаток от деления на ноль
4013 | ERR_ZERO_DIVIDE | Деление на ноль
4014 | ERR_UNKNOWN_COMMAND | Неизвестная команда
4015 | ERR_WRONG_JUMP | Неправильный переход
4016 | ERR_NOT_INITIALIZED_ARRAY | Неинициализированный массив
4017 | ERR_DLL_CALLS_NOT_ALLOWED | Вызовы DLL не разрешены
4018 | ERR_CANNOT_LOAD_LIBRARY | Невозможно загрузить библиотеку
4019 | ERR_CANNOT_CALL_FUNCTION | Невозможно вызвать функцию
4020 | ERR_EXTERNAL_CALLS_NOT_ALLOWED | Вызовы внешних библиотечных функций не разрешены
4021 | ERR_NO_MEMORY_FOR_RETURNED_STR | Недостаточно памяти для строки, возвращаемой из функции
4022 | ERR_SYSTEM_BUSY | Система занята
4023 | ERR_DLLFUNC_CRITICALERROR | Критическая ошибка вызова DLL-функции
4024 | ERR_INTERNAL_ERROR | Внутренняя ошибка
4025 | ERR_OUT_OF_MEMORY | Нет памяти
4026 | ERR_INVALID_POINTER | Неверный указатель
4027 | ERR_FORMAT_TOO_MANY_FORMATTERS | Слишком много параметров форматирования строки
4028 | ERR_FORMAT_TOO_MANY_PARAMETERS | Число параметров превышает число параметров форматирования строки
4029 | ERR_ARRAY_INVALID | Неверный массив
4030 | ERR_CHART_NOREPLY | График не отвечает
4050 | ERR_INVALID_FUNCTION_PARAMSCNT | Неправильное количество параметров функции
4051 | ERR_INVALID_FUNCTION_PARAMVALUE | Недопустимое значение параметра функции
4052 | ERR_STRING_FUNCTION_INTERNAL | Внутренняя ошибка строковой функции
4053 | ERR_SOME_ARRAY_ERROR | Ошибка массива
4054 | ERR_INCORRECT_SERIESARRAY_USING | Неправильное использование массива-таймсерии
4055 | ERR_CUSTOM_INDICATOR_ERROR | Ошибка пользовательского индикатора
4056 | ERR_INCOMPATIBLE_ARRAYS | Массивы несовместимы
4057 | ERR_GLOBAL_VARIABLES_PROCESSING | Ошибка обработки глобальных переменных
4058 | ERR_GLOBAL_VARIABLE_NOT_FOUND | Глобальная переменная не обнаружена
4059 | ERR_FUNC_NOT_ALLOWED_IN_TESTING | Функция не разрешена в тестовом режиме
4060 | ERR_FUNCTION_NOT_CONFIRMED | Функция не разрешена
4061 | ERR_SEND_MAIL_ERROR | Ошибка отправки почты
4062 | ERR_STRING_PARAMETER_EXPECTED | Ожидается параметр типа string
4063 | ERR_INTEGER_PARAMETER_EXPECTED | Ожидается параметр типа integer
4064 | ERR_DOUBLE_PARAMETER_EXPECTED | Ожидается параметр типа double
4065 | ERR_ARRAY_AS_PARAMETER_EXPECTED | В качестве параметра ожидается массив
4066 | ERR_HISTORY_WILL_UPDATED | Запрошенные исторические данные в состоянии обновления
4067 | ERR_TRADE_ERROR | Ошибка при выполнении торговой операции
4068 | ERR_RESOURCE_NOT_FOUND | Ресурс не найден
4069 | ERR_RESOURCE_NOT_SUPPORTED | Ресурс не поддерживается
4070 | ERR_RESOURCE_DUPLICATED | Дубликат ресурса
4071 | ERR_INDICATOR_CANNOT_INIT | Ошибка инициализации пользовательского индикатора
4072 | ERR_INDICATOR_CANNOT_LOAD | Ошибка загрузки пользовательского индикатора
4073 | ERR_NO_HISTORY_DATA | Нет исторических данных
4074 | ERR_NO_MEMORY_FOR_HISTORY | Не хватает памяти для исторических данных
4075 | ERR_NO_MEMORY_FOR_INDICATOR | Не хватает памяти для расчёта индикатора
4099 | ERR_END_OF_FILE | Конец файла
4100 | ERR_SOME_FILE_ERROR | Ошибка при работе с файлом
4101 | ERR_WRONG_FILE_NAME | Неправильное имя файла
4102 | ERR_TOO_MANY_OPENED_FILES | Слишком много открытых файлов
4103 | ERR_CANNOT_OPEN_FILE | Невозможно открыть файл
4104 | ERR_INCOMPATIBLE_FILEACCESS | Несовместимый режим доступа к файлу
4105 | ERR_NO_ORDER_SELECTED | Ни один ордер не выбран
4106 | ERR_UNKNOWN_SYMBOL | Неизвестный символ
4107 | ERR_INVALID_PRICE_PARAM | Неправильный параметр цены для торговой функции
4108 | ERR_INVALID_TICKET | Неверный номер тикета
4109 | ERR_TRADE_NOT_ALLOWED | Торговля не разрешена. Необходимо включить опцию "Разрешить советнику торговать" в свойствах эксперта
4110 | ERR_LONGS_NOT_ALLOWED | Ордера на покупку не разрешены. Необходимо проверить свойства эксперта
4111 | ERR_SHORTS_NOT_ALLOWED | Ордера на продажу не разрешены. Необходимо проверить свойства эксперта
4112 | ERR_TRADE_EXPERT_DISABLED_BY_SERVER | Автоматическая торговля с помощью экспертов/скриптов запрещена на стороне сервера
4200 | ERR_OBJECT_ALREADY_EXISTS | Объект уже существует
4201 | ERR_UNKNOWN_OBJECT_PROPERTY | Запрошено неизвестное свойство объекта
4202 | ERR_OBJECT_DOES_NOT_EXIST | Объект не существует
4203 | ERR_UNKNOWN_OBJECT_TYPE | Неизвестный тип объекта
4204 | ERR_NO_OBJECT_NAME | Нет имени объекта
4205 | ERR_OBJECT_COORDINATES_ERROR | Ошибка координат объекта
4206 | ERR_NO_SPECIFIED_SUBWINDOW | Не найдено указанное подокно
4207 | ERR_SOME_OBJECT_ERROR | Ошибка при работе с объектом
4210 | ERR_CHART_PROP_INVALID | Неизвестное свойство графика
4211 | ERR_CHART_NOT_FOUND | График не найден
4212 | ERR_CHARTWINDOW_NOT_FOUND | Не найдено подокно графика
4213 | ERR_CHARTINDICATOR_NOT_FOUND | Индикатор не найден
4220 | ERR_SYMBOL_SELECT | Ошибка выбора инструмента
4250 | ERR_NOTIFICATION_ERROR | Ошибка отправки push-уведомления
4251 | ERR_NOTIFICATION_PARAMETER | Ошибка параметров push-уведомления
4252 | ERR_NOTIFICATION_SETTINGS | Уведомления запрещены
4253 | ERR_NOTIFICATION_TOO_FREQUENT | Слишком частые запросы отсылки push-уведомлений
4260 | ERR_FTP_NOSERVER | Не указан FTP сервер
4261 | ERR_FTP_NOLOGIN | Не указан FTP логин
4262 | ERR_FTP_CONNECT_FAILED | Ошибка при подключении к FTP серверу
4263 | ERR_FTP_CLOSED | Подключение к FTP серверу закрыто
4264 | ERR_FTP_CHANGEDIR | На FTP сервере не найдена директория для выгрузки файла
4265 | ERR_FTP_FILE_ERROR | Не найден файл в директории MQL4\Files для отправки на FTP сервер
4266 | ERR_FTP_ERROR | Ошибка при передаче файла на FTP сервер
5001 | ERR_FILE_TOO_MANY_OPENED | Слишком много открытых файлов
5002 | ERR_FILE_WRONG_FILENAME | Неверное имя файла
5003 | ERR_FILE_TOO_LONG_FILENAME | Слишком длинное имя файла
5004 | ERR_FILE_CANNOT_OPEN | Ошибка открытия файла
5005 | ERR_FILE_BUFFER_ALLOCATION_ERROR | Ошибка размещения буфера текстового файла
5006 | ERR_FILE_CANNOT_DELETE | Ошибка удаления файла
5007 | ERR_FILE_INVALID_HANDLE | Неверный хендл файла (файл закрыт или не был открыт)
5008 | ERR_FILE_WRONG_HANDLE | Неверный хендл файла (индекс хендла отсутствует в таблице)
5009 | ERR_FILE_NOT_TOWRITE | Файл должен быть открыт с флагом FILE_WRITE
5010 | ERR_FILE_NOT_TOREAD | Файл должен быть открыт с флагом FILE_READ
5011 | ERR_FILE_NOT_BIN | Файл должен быть открыт с флагом FILE_BIN
5012 | ERR_FILE_NOT_TXT | Файл должен быть открыт с флагом FILE_TXT
5013 | ERR_FILE_NOT_TXTORCSV | Файл должен быть открыт с флагом FILE_TXT или FILE_CSV
5014 | ERR_FILE_NOT_CSV | Файл должен быть открыт с флагом FILE_CSV
5015 | ERR_FILE_READ_ERROR | Ошибка чтения файла
5016 | ERR_FILE_WRITE_ERROR | Ошибка записи файла
5017 | ERR_FILE_BIN_STRINGSIZE | Размер строки должен быть указан для двоичных файлов
5018 | ERR_FILE_INCOMPATIBLE | Неверный тип файла (для строковых массивов-TXT, для всех других-BIN)
5019 | ERR_FILE_IS_DIRECTORY | Файл является директорией
5020 | ERR_FILE_NOT_EXIST | Файл не существует
5021 | ERR_FILE_CANNOT_REWRITE | Файл не может быть перезаписан
5022 | ERR_FILE_WRONG_DIRECTORYNAME | Неверное имя директории
5023 | ERR_FILE_DIRECTORY_NOT_EXIST | Директория не существует
5024 | ERR_FILE_NOT_DIRECTORY | Указанный файл не является директорией
5025 | ERR_FILE_CANNOT_DELETE_DIRECTORY | Ошибка удаления директории
5026 | ERR_FILE_CANNOT_CLEAN_DIRECTORY | Ошибка очистки директории
5027 | ERR_FILE_ARRAYRESIZE_ERROR | Ошибка изменения размера массива
5028 | ERR_FILE_STRINGRESIZE_ERROR | Ошибка изменения размера строки
5029 | ERR_FILE_STRUCT_WITH_OBJECTS | Структура содержит строки или динамические массивы
5200 | ERR_WEBREQUEST_INVALID_ADDRESS | URL не прошел проверку
5201 | ERR_WEBREQUEST_CONNECT_FAILED | Не удалось подключиться к указанному URL
5202 | ERR_WEBREQUEST_TIMEOUT | Превышен таймаут получения данных
5203 | ERR_WEBREQUEST_REQUEST_FAILED | Ошибка в результате выполнения HTTP запроса
 | Пользовательские ошибки |
65536 | ERR_USER_ERROR_FIRST | С этого кода начинаются ошибки, задаваемые пользователем


Константы ввода/вывода

Справочник MQL4 / Константы, перечисления и структуры / Константы ввода/вывода

Константы ввода/вывода

Константы:

  • Флаги открытия файлов
  • Свойства файлов
  • Позиционирование внутри файла
  • Использование кодовой страницы
  • MessageBox


Флаги открытия файлов

Справочник MQL4 / Константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов

Флаги открытия файлов

Значения флагов, определяющих режим работы с файлом. Флаги определены следующим образом:

Идентификатор | Значение | Описание
FILE_READ | 1 | Файл открывается для чтения. Флаг используется при открытии файлов (FileOpen()). При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ
FILE_WRITE | 2 | Файл открывается для записи. Флаг используется при открытии файлов (FileOpen()). При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ
FILE_BIN | 4 | Двоичный режим чтения-записи (без преобразования из строки и в строку). Флаг используется при открытии файлов (FileOpen())
FILE_CSV | 8 | Файл типа csv (все записанные элементы преобразуются к строкам соответствующего типа, unicode или ansi, и разделяются разделителем). Флаг используется при открытии файлов (FileOpen())
FILE_TXT | 16 | Простой текстовый файл (тот же csv, однако разделитель не принимается во внимание). Флаг используется при открытии файлов (FileOpen())
FILE_ANSI | 32 | Строки типа ANSI (однобайтовые символы). Флаг используется при открытии файлов (FileOpen())
FILE_UNICODE | 64 | Строки типа UNICODE (двухбайтовые символы). Флаг используется при открытии файлов (FileOpen())
FILE_SHARE_READ | 128 | Совместный доступ по чтению со стороны нескольких программ. Флаг используется при открытии файлов (FileOpen()), но не заменяет при открытии файла необходимости указать FILE_WRITE и/или флаг FILE_READ
FILE_SHARE_WRITE | 256 | Совместный доступ по записи со стороны нескольких программ. Флаг используется при открытии файлов (FileOpen()), но не заменяет при открытии файла необходимости указать FILE_WRITE и/или флаг FILE_READ
FILE_REWRITE | 512 | Возможность перезаписывания файла функциями FileCopy() и FileMove(). Файл должен существовать или открываться для записи. В противном случае файл открыт не будет
FILE_COMMON | 4096 | Расположение файла в общей папке всех клиентских терминалов \Terminal\Common\Files. Флаг используется при открытии файлов (FileOpen()), копировании файлов (FileCopy(), FileMove()) и проверке существования файлов (FileIsExist())

При открытии файла можно указать один или более флагов, такое сочетание называется комбинацией флагов. Комбинация флагов записывается с помощью знака операции логического ИЛИ (|), который ставится между перечисляемыми флагами. Например, чтобы открыть файл в формате CSV одновременно на чтение и на запись, можно указать комбинацию FILE_READ|FILE_WRITE|FILE_CSV.

Пример:

int filehandle=FileOpen(filename,FILE_READ|FILE_WRITE|FILE_CSV);

Есть некоторые особенности работы при указании флагов чтения и записи:

  • Если указан FILE_READ – делается попытка открытия уже существующего файла. Если файл не существует, то открыть файл не получится, новый файл не создается.
  • Если FILE_READ|FILE_WRITE – создаётся новый файл если файл с таким именем отсутствует.
  • Если FILE_WRITE – файл создается заново с нулевым размером.

При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ.

Флаги, определяющие тип чтения открытого файла, имеют приоритет. Самый старший флаг FILE_CSV, затем следует по старшинству флаг FILE_BIN, и наименьший приоритет имеет флаг FILE_TXT. Таким образом, если вдруг будут указаны сразу несколько флагов (FILE_TXT|FILE_CSV или FILE_TXT|FILE_BIN или FILE_BIN|FILE_CSV), то будет использован самый старший по приоритету флаг.

Флаги, определяющие тип кодировки, также имеют приоритет. Флаг FILE_UNICODE имеет более старший приоритет,чем флаг FILE_ANSI. Поэтому при указании комбинации FILE_UNICODE|FILE_ANSI будет использоваться флаг FILE_UNICODE.

Если не указано ни FILE_UNICODE, ни FILE_ANSI, то подразумевается FILE_UNICODE. Если не указано ни FILE_CSV, ни FILE_BIN, ни FILE_TXT, то подразумевается FILE_CSV.

Если файл открыт на чтение как текстовый (FILE_TXT или FILE_CSV), и при этом в начале файла будет обнаружен специальный двухбайтовый признак 0xff,0xfe, то флаг кодировки будет FILE_UNICODE, даже если указан флаг FILE_ANSI.

Смотри также

Файловые операции


Свойства файлов

Справочник MQL4 / Константы, перечисления и структуры / Константы ввода/вывода / Свойства файлов

Свойства файлов

Для получения свойств файлов используется функция FileGetInteger(), которой при вызове передается идентификатор требуемого свойства из перечисления ENUM_FILE_PROPERTY_INTEGER

ENUM_FILE_PROPERTY_INTEGER

Идентификатор | Описание идентификатора
FILE_EXISTS | Проверка на существование
FILE_CREATE_DATE | Дата создания
FILE_MODIFY_DATE | Дата последнего изменения
FILE_ACCESS_DATE | Дата последнего доступа к файлу
FILE_SIZE | Размер файла в байтах
FILE_POSITION | Позиция указателя в файле
FILE_END | Получение признака конца файла
FILE_LINE_END | Получение признака конца строки
FILE_IS_COMMON | Файл открыт в общей папке всех клиентских терминалов (смотри FILE_COMMON)
FILE_IS_TEXT | Файл открыт как текстовый (смотри FILE_TXT)
FILE_IS_BINARY | Файл открыт как бинарный (смотри FILE_BIN)
FILE_IS_CSV | Файл открыт как CSV (смотри FILE_CSV)
FILE_IS_ANSI | Файл открыт как ANSI (смотри FILE_ANSI)
FILE_IS_READABLE | Файл открыт с возможностью чтения (смотри FILE_READ)
FILE_IS_WRITABLE | Файл открыт с возможностью записи (смотри FILE_WRITE)

Функция FileGetInteger() имеет два варианта вызова. В первом варианте для получения свойств файла указывается его хэндл, полученный при открытии файла функцией FileOpen(). Этот вариант позволяет получить все свойства файла.

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

  • FILE_EXISTS – существование указанного по имени файла;
  • FILE_CREATE_DATE – дата создания файла с указанным именем;
  • FILE_MODIFY_DATE – дата изменения файла с указанным именем;
  • FILE_ACCESS_DATE – дата последнего доступа к файлу с указанным именем;
  • FILE_SIZE – размер файла с указанным именем.

При попытке получения других свойств, кроме указанных выше, второй вариант вызова функции FileGetInteger() вернет ошибку.


Позиционирование внутри файла

Справочник MQL4 / Константы, перечисления и структуры / Константы ввода/вывода / Позиционирование внутри файла

Позиционирование внутри файла

Большая часть файловых функций связана с операциями чтения/записи информации. При этом с помощью функции FileSeek() можно указывать положение файлового указателя на позицию внутри файла, с которой будет производится следующая операция чтения или записи. Перечисление ENUM_FILE_POSITION содержит допустимые положения указателя, относительно которого можно указать смещения в байтах для следующей операции.

ENUM_FILE_POSITION

Идентификатор | Описание
SEEK_SET | Начало файла
SEEK_CUR | Текущая позиция файлового указателя
SEEK_END | Конец файла

Смотри также

FileIsEnding, FileIsLineEnding


Использование кодовой страницы

Справочник MQL4 / Константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы

Использование кодовой страницы в операциях преобразования строк

При операциях конвертации строковых переменных в массивы типа char и обратно в языке MQL4 используется кодировка, соответствующая по умолчанию текущей ANSI кодировке операционной системы Windows (CP_ACP). Если требуется указать иной тип кодировки, то его можно задать дополнительным параметром для функций CharArrayToString(), StringToCharArray() и FileOpen().

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

Встроенные константы кодовых страниц

Константа | Значение | Описание
CP_ACP | 0 | Текущая кодовая страница ANSI кодировка в операционной системе Windows
CP_OEMCP | 1 | Текущая кодовая страница OEM.
CP_MACCP | 2 | Текущая кодовая страница Macintosh. Примечание: Это значение преимущественно используется в ранее созданных программных кодах и теперь в нем нет необходимости, так как современные компьютеры Macintosh используют Unicode кодировку.
CP_THREAD_ACP | 3 | Кодировка Windows ANSI для текущего потока выполнения.
CP_SYMBOL | 42 | Кодовая страница Symbol
CP_UTF7 | 65000 | Кодовая страница UTF-7.
CP_UTF8 | 65001 | Кодовая страница UTF-8.

Смотри также

Состояние клиентского терминала


Константы окна MessageBox

Справочник MQL4 / Константы, перечисления и структуры / Константы ввода/вывода / MessageBox

Константы диалогового окна MessageBox

Коды возврата функции MessageBox(). Если окно сообщения имеет кнопку Отмена (Cancel), то функция возвращает значение IDCANCEL при нажатой клавише ESC или кнопке Отмена (Cancel). Если окно сообщения не имеет кнопки Отмена (Cancel), нажатие ESC не дает никакого эффекта.

Константа | Значение | Описание
IDOK | 1 | Выбрана кнопка OK
IDCANCEL | 2 | Выбрана кнопка Отмена (Cancel)
IDABORT | 3 | Выбрана кнопка Прервать (Abort)
IDRETRY | 4 | Выбрана кнопка Повтор (Retry)
IDIGNORE | 5 | Выбрана кнопка Пропустить (Ignore)
IDYES | 6 | Выбрана кнопка Да (Yes)
IDNO | 7 | Выбрана кнопка Нет (No)
IDTRYAGAIN | 10 | Выбрана кнопка Повторить (Try Again)
IDCONTINUE | 11 | Выбрана кнопка Продолжить (Continue)

Основные флаги функции MessageBox() определяют содержание и поведение диалогового окна. Это значение может быть комбинацией флагов из следующих групп флагов:

Константа | Значение | Описание
MB_OK | 0x00000000 | Окно сообщения содержит одну кнопку: OK. По умолчанию
MB_OKCANCEL | 0x00000001 | Окно сообщения содержит две кнопки: OK и Cancel
MB_ABORTRETRYIGNORE | 0x00000002 | Окно сообщения содержит три кнопки: Abort, Retry и Ignore
MB_YESNOCANCEL | 0x00000003 | Окно сообщения содержит три кнопки: Yes, No и Cancel
MB_YESNO | 0x00000004 | Окно сообщения содержит две кнопки: Yes и No
MB_RETRYCANCEL | 0x00000005 | Окно сообщения содержит две кнопки: Retry и Cancel
MB_CANCELTRYCONTINUE | 0x00000006 | Окно сообщения содержит три кнопки: Cancel, Try Again, Continue

Для отображения иконки в окне сообщения необходимо определить дополнительные флаги:

Константа | Значение | Описание
MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND | 0x00000010 | Изображение знака STOP
MB_ICONQUESTION | 0x00000020 | Изображение вопросительного знака
MB_ICONEXCLAMATION, MB_ICONWARNING | 0x00000030 | Изображение восклицательного знака
MB_ICONINFORMATION, MB_ICONASTERISK | 0x00000040 | Изображение, состоящее из строчного знака i в круге

Кнопки по умолчанию задаются следующими флагами:

Константа | Значение | Описание
MB_DEFBUTTON1 | 0x00000000 | Первая кнопка MB_DEFBUTTON1 - кнопка выбрана по умолчанию, если MB_DEFBUTTON2, MB_DEFBUTTON3, или MB_DEFBUTTON4 не определены
MB_DEFBUTTON2 | 0x00000100 | Вторая кнопка - кнопка по умолчанию
MB_DEFBUTTON3 | 0x00000200 | Третья кнопка - кнопка по умолчанию
MB_DEFBUTTON4 | 0x00000300 | Четвертая кнопка - кнопка по умолчанию


Программы MQL4

Справочник MQL4 / Программы MQL4

Программы MQL4

Для того чтобы mql4-программа могла работать, она должна быть скомпилирована (кнопка "Компилировать" или клавиша F7). Компиляция должна пройти без ошибок (допускаются предупреждения, которые необходимо проанализировать). При этом в соответствующей директории terminal_dir\MQL4\Experts, terminal_dir\MQL4\indicators или terminal_dir\MQL4\scripts должен быть создан выполняемый файл с тем же именем и расширением EX4. Именно этот файл может быть запущен на выполнение.

Особенности работы mql4-программ описаны в разделах:

  • Выполнение программ – порядок вызова предопределенных функций-обработчиков событий;
  • События клиентского терминала – описание событий, которые можно обрабатывать в программах;
  • Вызов импортируемых функций – порядок описания, допустимые параметры, порядок поиска и соглашения о связях импортируемых функций;
  • Ошибки выполнения – получение информации об ошибках выполнения и критические ошибки.

Эксперты, пользовательские индикаторы и скрипты прикрепляются к одному из открытых графиков путем перетаскивания мышью из окна "Навигатор" клиентского терминала на соответствующий график (технология Drag'n'Drop). mql4-программы могут работать только при включенном клиентском терминале.

Для того чтобы эксперт прекратил свою работу, его необходимо удалить с графика. Для этого из контекстного меню графика следует выбрать "Список экспертов", далее выбрать сответник из списка и нажать кнопку "Удалить". На работу советника также влияет состояние кнопки "Авто-торговля".

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

Пользовательские индикаторы и советники работают до тех пор, пока их явно не удалят с графика; информация о прикрепленных советниках и пользовательских индикаторах сохраняется между запусками клиентского терминала.

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

На одном графике могут работать максимум по одному эксперту и скрипту и неограниченное количество индикаторов.

Что нового в MQL5

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

  • NewTick – возникает при поступлении новых котировок и обрабатывается в советниках функцией OnTick()
  • Calculate – создается только для индикаторов при любом изменении ценовых данных и обрабатывается функцией OnCalculate()
  • Trade – генерируется при завершении торговой операции на торговом сервере и обрабатывается функцией OnTrade()
  • TradeTransaction – отправлется торговым сервером в терминал при изменениях на торговом счете и обрабатывается функцией OnTradeTransaction()
  • BookEvent – сообщает об изменениях стакана цен и обрабатывается функцией OnBookEvent().

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

  • Автоматическая загрузка истории и синхронизация баров по всем таймфреймам – вся необходимая для тестирования история скачивается терминалом автоматически.
  • Использование реальных тиков при тестировании – теперь проверить свою торговлю на истории можно максимально точно. Эмуляция поступления тиков по всем символам.
  • Мультивалютное тестирование позволяет создавать стратегии, которые торгуют на нескольких инструментах. При этом корректно синхронизируются тики и бары по всем символам, точно моделируется торговое окружение, включая спреды, маржинальные требования и расчет прибыли в нужной валюте депозита.
  • Функции OnTimer() и Sleep() корректно работают в тестере и позволяют провести их отладку.
  • Мультипоточный тестер используют все вычислительные ядра процессора и позволяет провести оптимизацию на тысячах агентах из MQL5 Cloud Network.


Выполнение программ

Справочник MQL4 / Программы MQL4 / Выполнение программ

Выполнение программ

Каждый скрипт и каждый эксперт работает в собственном отдельном потоке. Все индикаторы работают в одном интерфейсном потоке терминала. Обработка тиков и синхронизация истории также производится в интерфейсном потоке. Если пользовательский индикатор вызван при помощи функции iCustom(), то этот индикатор работает в потоке вызвавшей его программы. Библиотечные (импортируемые) функции также работают в потоке вызывающей программы.

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

Краткая сводка по программам на MQL4 приведена в таблице:

Программа | Выполнение | Примечание
Скрипт | В собственном потоке, сколько скриптов - столько потоков выполнения для них | Зацикленный скрипт не может нарушить работу других программ
Эксперт | В собственном потоке, сколько экспертов - столько потоков выполнения для них | Зацикленный эксперт не может нарушить работу других программ
Индикатор | В одном интерфейсном потоке терминала | Бесконечный цикл в одном индикаторе остановит работу терминала

Сразу после присоединения программы к графику производится ее загрузка в память клиентского терминала и инициализация глобальных переменных. Если какая-либо глобальная переменная типа класса имеет конструктор, то этот конструктор будет вызван в процессе инициализации глобальных переменных.

После этого программа находится в состоянии ожидания события от клиентского терминала. У каждой mql4-программы должна быть хотя бы одна функция-обработчик события, в противном случае загруженная программа выполняться не будет. Функции-обработчики событий имеют предопределенные имена, предопределенные наборы параметров и предопределенные типы возврата.

Тип | Имя функции | Параметры | Применение | Примечание
int | OnInit | нет | эксперты, индикаторы и скрипты | Обработчик события Init. Допускается тип возвращаемого значения void.
void | OnDeinit | const int reason | эксперты, индикаторы и скрипты | Обработчик события Deinit.
void | OnStart | нет | скрипты | Обработчик события Start.
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 &TickVolume[], const long &Volume[], const int &Spread[] | индикаторы | Обработчик события Calculate на всех ценовых данных.
void | OnTick | нет | эксперты | Обработчик события NewTick. Пока идет обработка события прихода нового тика другие события этого типа не приходят.
void | OnTimer | нет | эксперты и индикаторы | Обработчик события Timer.
double | OnTester | нет | эксперты | Обработчики события Tester
void | OnChartEvent | const int id, const long &lparam, const double &dparam, const string &sparam | эксперты и индикаторы | Обработчик события ChartEvent.

Клиентский терминал отсылает возникающие события в соответствующие открытые графики. Также события могут генерироваться графиками (события графика) либо mql4-программами (пользовательские события). Генерацию событий создания и удаления графических объектов на графике можно включать и отключать заданием свойств графика CHART_EVENT_OBJECT_CREATE и CHART_EVENT_OBJECT_DELETE. Каждая mql4-программа и каждый график имеют свою собственную очередь событий, куда складываются все вновь поступающие события.

Программа получает события только от графика, на котором она запущена. Все события обрабатываются одно за другим в порядке поступления. Если в очереди уже есть событие NewTick либо это событие находится в состоянии обработки, то новое событие NewTick в очередь mql4-программы не ставится. Аналогично, если в очереди mql4-программы уже находится событие ChartEvent или такое событие обрабатывается, то новое событие такого типа не ставится в очередь. Обработка событий таймера производится по такой же схеме – если в очереди находится или уже обрабатывается событие Timer, то новое событие таймера не ставится в очередь.

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

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

Библиотеки не обрабатывают никаких событий.

Запрет на использование функций в индикаторах и экспертах

Индикаторы, скрипты и эксперты являются исполняемыми программами на MQL4 и предназначены для различных типов задач. Поэтому существует ограничение на использование определенных функций в зависимости от типа программы. В индикаторах запрещены следующие функции:

  • OrderSend();
  • SendFTP();
  • Sleep();
  • ExpertRemove();
  • MessageBox().

В свою очередь, в экспертах и скриптах запрещены все функции, предназначенные для индикаторов:

  • SetIndexBuffer();
  • IndicatorSetDouble();
  • IndicatorSetInteger();
  • IndicatorSetString().

Библиотека не является самостоятельной программой и выполняется в контексте вызвавшей её MQL4-программы: скрипт, индикатор или эксперт. Соответственно, на вызванную библиотеку распространяются указанные выше ограничения.

Загрузка и выгрузка индикаторов

Индикаторы загружаются в следующих случаях:

  • прикрепление индикатора к графику;
  • запуск терминала (если индикатор был прикреплен к графику перед предыдущим закрытием терминала);
  • загрузка шаблона (если в шаблоне указан прикрепленный к графику индикатор);
  • смена профиля (если индикатор прикреплен к одному из графиков профиля);
  • смена символа и/или периода графика, к которому прикреплен индикатор;
  • после удачной перекомпиляции индикатора, если данный индикатор был прикреплен к графику.
  • изменение входных параметров индикатора.

Индикаторы выгружаются в следующих случаях:

  • при откреплении индикатора от графика;
  • закрытие терминала (если индикатор был прикреплен к графику);
  • загрузка шаблона, если к графику прикреплен индикатор;
  • закрытие графика, к которому был прикреплен индикатор;
  • смена профиля, если индикатор прикреплен к одному из графиков сменяемого профиля;
  • смена символа и/или периода графика, к которому прикреплен индикатор;
  • изменение входных параметров индикатора.

Загрузка и выгрузка экспертов

Загрузка эксперта производится в следующих случаях:

  • прикрепление эксперта к графику;
  • запуск терминала (если эксперт был прикреплен к графику перед предыдущим закрытием терминала);
  • загрузка шаблона (если в шаблоне указан прикрепленный к графику эксперт);
  • после удачной перекомпиляции эксперта, если данный эксперт был прикреплен к графику.
  • смена профиля (если эксперт прикреплен к одному из графиков профиля);
  • подключение к счету, даже если номер счета не менялся (если эксперт был прикреплен к графику перед авторизацией терминала на сервере).

Выгрузка эксперта, прикрепленного к графику, производится в следующих случаях:

  • при откреплении эксперта от графика;
  • при прикреплении эксперта к графику – если на данном графике был уже другой эксперт, то этот эксперт выгружается;
  • закрытие терминала (если эксперт был прикреплен к графику);
  • загрузка шаблона, если к графику прикреплен эксперт;
  • закрытие графика, к которому был прикреплен эксперт;
  • смена профиля, если эксперт прикреплен к одному из графиков сменяемого профиля;
  • смена счета, к которому подключен терминал (если эксперт был прикреплен к графику перед авторизацией терминала на сервере);
  • вызов функции ExpertRemove().

При смене символа или таймфрейма графика, к которому эксперт прикреплен, выгрузка и загрузка эксперта не производится. При этом последовательно вызываются обработчики OnDeinit() на старом символе/таймфрейме и OnInit() на новом символе/таймфрейме (если они есть), значения глобальных переменных и статических переменных не сбрасываются. Все события, поступившие для эксперта до завершения инициализации (функции OnInit()), пропускаются.

Для лучшего понимания работы эксперта рекомендуется скомпилировать код приведенного в примере эксперта и произвести действия по загрузке/выгрузке экспертов, смене шаблона, символа, таймфрейма и так далее:

Пример:

//+------------------------------------------------------------------+
//| TestExpert.mq5 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2014, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"

class CTestClass
{
public:
CTestClass() { Print("CTestClass constructor"); }
~CTestClass() { Print("CTestClass destructor"); }
};
CTestClass global;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Print("Initialization");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Print("Deinitialization with reason ",reason);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---

}

Загрузка и выгрузка скриптов

Скрипты загружаются сразу после прикрепления к графику и выгружаются сразу после окончания своей работы.

При выгрузке программы (удалении программы с графика) происходит деинициализация глобальных переменных и уничтожение очереди сообщений. В этом случае деинициализация означает освобождение переменных типа string, освобождение объектов динамических массивов и вызов деструкторов при их наличии.

Скрипты загружаются сразу после прикрепления к графику и выгружаются сразу после окончания своей работы.

//+------------------------------------------------------------------+
//| TestScript.mq5 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2014, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"

class CTestClass
{
public:
CTestClass() { Print("CTestClass constructor"); }
~CTestClass() { Print("CTestClass destructor"); }
};
CTestClass global;
//+------------------------------------------------------------------+
//| Script program initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
Print(__FUNCTION__);
}
//+------------------------------------------------------------------+
//| Script program deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Print(__FUNCTION__," reason=",reason);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
Print(__FUNCTION__);
}

Входные параметры и компиляция исходного кода программ

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

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

Состав входных параметров программы считается измененным при правке исходного кода в следующих случаях:

  • изменилось количество параметров;
  • изменился порядок следования параметров;
  • изменились наименования параметров;
  • изменился тип одного или более параметров.

Изменение значения по умолчанию любого из параметров не считается изменением состава входных параметров.

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

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

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

При любой компиляции будет вызвана предопределенная функция OnInit(), назначение которой состоит в правильной инициализации всех глобальных и статических переменных программы. Именно в обработчике OnInit() необходимо правильным образом получать значения входных параметров программы.

Смотри также

События клиентского терминала, Функции обработки событий


Разрешение на торговлю

Справочник MQL4 / Программы MQL4 / Разрешение на торговлю

Разрешение на торговлю

Автоматизация торговли

В языке MQL4 существует специальная группа торговых функций, с помощью которых можно создавать автоматизированные торговые системы. Программы для автоматической торговли без участия человека называются экспертами (Expert Advisor) или торговыми роботами. Для создания эксперта в редакторе MetaEditor запустите Мастер MQL4 и выберите опцию "Советник (шаблон)". Она позволяет создать шаблон с готовыми функциями обработки событий, который необходимо дополнить всем необходимым функционалом с помощью самостоятельного программирования.

Торговые функции могут работать только в экспертах и скриптах, для индикаторов торговля запрещена.

Проверка разрешения на автоматическую торговлю

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

Проверка на разрешение автоматической торговли в самом терминале

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

Переключать опцию разрешения автоматической торговли также можно прямо из Стандартной панели терминала:

  • – автоматическая торговля разрешена, торговые функции в запущенных программах разрешены для использования.
  • – автоматическая торговля запрещена, при этом сами запущенные программы будут работать, хотя торговые функции не смогут выполняться.

Пример проверки:

if (!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
Alert("Проверьте в настройках терминала разрешение на автоматическую торговлю!");

Проверка разрешения на торговлю для данного запущенного эксперта/скрипта

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

Пример проверки:

if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
Alert("Проверьте в настройках терминала разрешение на автоматическую торговлю!");
else
{
if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
Alert("Автоматическая торговля запрещена в свойствах программы для ",__FILE__);
}

Проверка разрешения на торговлю любым экспертам/скриптам для данного счета

Запрет на автоматическую торговлю может быть установлен на стороне торгового сервера. Пример проверки такой ситуации:

if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
Alert("Автоматическая торговля запрещена для счета ",AccountInfoInteger(ACCOUNT_LOGIN),
" на стороне торгового сервера");

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

Проверка разрешения торговли для данного счета

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

if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
Comment("Торговля запрещена для счета ",AccountInfoInteger(ACCOUNT_LOGIN),
".\n Возможно, подключение к торговому счету произведено по инвест паролю.",
"\n Проверьте журнал терминала, есть ли там такая запись:",
"\n\'",AccountInfoInteger(ACCOUNT_LOGIN),"\': trading has been disabled - investor mode.");

AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) может возвращать false в следующих случаях:

  • нет соединения с торговым сервером. Можно проверить с помощью TerminalInfoInteger(TERMINAL_CONNECTED));
  • торговый счет переведен в режим read-only (отправлен в архив);
  • торговля на счете запрещена на стороне торгового сервера;
  • подключение к торговому счете произведено в режиме инвестора.

Смотри также

Состояние клиентского терминала, Информация о счете, Информация о запущенной MQL4-программе


События клиентского терминала

Справочник MQL4 / Программы MQL4 / События клиентского терминала

События клиентского терминала

Init

Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора. Советник также инициализируется после смены счета.

Deinit

Перед деинициализацией глобальных переменных и выгрузкой программы (эксперт или пользовательский индикатор) клиентский терминал посылает программе событие Deinit. Событие Deinit также генерируется при завершении работы клиентского терминала, при закрытии графика, непосредственно перед сменой финансового инструмента и/или периода графика, при удачной перекомпиляции программы, при смене входных параметров, а также при смене счета.

Причину деинициализации можно получить из параметра, переданного в функцию OnDeinit(). Выполнение функции OnDeinit() ограничивается 2.5 секундами. Если за это время функция не закончила свою работу, то ее выполнение завершается принудительно.

Start

Событие Start – это специальное событие для активизации скрипта после его загрузки. Это событие обрабатывается функцией OnStart. Событие Start экспертам и пользовательским индикаторам не посылается.

NewTick

Событие NewTick генерируется при поступлении новых котировок и обрабатывается функцией OnTick() у присоединенных советников. Если при поступлении новой котировки выполнялась функция OnTick, запущенная на предыдущей котировке, то пришедшая котировка будет проигнорирована советником, так как соответствующее событие не будет поставлено в очередь событий эксперта.

Все пришедшие во время выполнения программы новые котировки программой игнорируются до тех пор, пока не завершится очередное выполнение функции OnTick(). После этого функция будет запущена только после прихода очередной новой котировки.

Событие NewTick генерируется независимо от того, запрещена или разрешена автоматическая торговля (кнопка "Разрешить/запретить Авто-торговлю"). Запрет автоматической торговли означает только запрет на отправку торговых запросов из эксперта, работа эксперта не прекращается.

Запрет автоматической торговли путем нажатия на указанную кнопку не прерывает текущее выполнение функции OnTick().

Calculate

Событие Calculate генерируется только для индикаторов сразу после посылки события Init и при любом изменении ценовых данных. Обрабатывается функцией OnCalculate.

Timer

Событие Timer периодически генерируется клиентским терминалом для эксперта, который активизировал таймер при помощи функции EventSetTimer. Обычно эта функция вызывается в функции OnInit. Обработка события Timer производится функцией OnTimer. При завершении работы эксперта необходимо уничтожить созданный таймер при помощи EventKillTimer, которую обычно вызывают в функции OnDeinit.

Tester

Событие Tester генерируется по окончании тестирования эксперта на исторических данных. Обработка события Tester производится функцией OnTester().

ChartEvent

Событие ChartEvent генерируется клиентским терминалом при работе пользователя с графиком:

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

Также существует пользовательское событие ChartEvent, которое может послать эксперту любая mql4-программа при помощи функции EventChartCustom. Событие обрабатывается функцией OnChartEvent.

Смотри также

Функции обработки событий, Выполнение программ


Ресурсы

Справочник MQL4 / Программы MQL4 / Ресурсы

Ресурсы

Использование графики и звука в программах на MQL4

Программы на MQL4 позволяют работать со звуковыми и графическими файлами:

  • PlaySound() воспроизводит звуковой файл;
  • ObjectCreate() позволяет с помощью графических объектов OBJ_BITMAP и OBJ_BITMAP_LABEL создавать пользовательские интерфейсы.

PlaySound()

Пример вызова функции PlaySound():

//+------------------------------------------------------------------+
//| Функция вызывает штатную OrderSend() и проигрывает звук |
//+------------------------------------------------------------------+
void OrderSendWithAudio()
{
double price=Ask;
//--- размещение рыночного ордера на покупку 1 лота текущего символа
int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,0,0,"My order",16384,0,clrGreen);
if(ticket<0)
{
Print("Вызов OrderSend завершился с ошибкой #",GetLastError());
//--- при ошибке проигрывает звук из файла timeout.wav
PlaySound("timeout.wav");
}
else
{
Print("Ордер успешно размещен");
//--- при удачном размещении ордера проигрывает звук из файла Ok.wav
PlaySound("Ok.wav");
}
}

В данном примере показано как проигрывать звуки из файлов Ok.wav и timeoit.wav, входящих в стандартную поставку терминала. Эти файлы находятся в папке каталог_терминала\Sounds. Здесь каталог_терминала означает папку, из которой запущен клиентский терминал MetaTrader 4. Программным путем из mql4-программы каталог терминала можно узнать следующим образом:

//--- Папка, в которой хранятся данные терминала
string terminal_path=TerminalInfoString(TERMINAL_PATH);

Можно использовать звуковые файлы не только из папки каталог_терминала\Sounds, но и из любой подпапки, находящейся в папке каталог_данных_терминала\MQL4. Расположение каталога данных терминала на компьютере можно выяснить через меню терминала "Файл"-"Открыть каталог данных" или программным путем:

//--- Папка, в которой хранятся данные терминала
string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);

Например, если звуковой файл Demo.wav лежит в папке каталог_данных_терминала\MQL4\Files, то вызов PlaySound() должен быть записан таким образом:

//--- проиграем звуковой файл Demo.wav из папки каталог_данных_терминала\MQL4\Files\Demo.wav
PlaySound("\\Files\\Demo.wav");

Обратите внимание на то, что в комментарии путь к файлу написан с использованием символа "\", а в самой функции для разделения папок в пути используется последовательность "\\".

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

Для остановки воспроизведения файла нужно вызвать функцию PlaySound() с параметром NULL:

//--- вызов PlaySound с параметром NULL останавливает воспроизведение звука
PlaySound(NULL);

ObjectCreate()

Пример эксперта, который с помощью функции ObjectCreate() создает объект "Графическая метка" (OBJ_BITMAP_LABEL).

string label_name="currency_label"; // имя объекта OBJ_BITMAP_LABEL
string euro ="\\Images\\euro.bmp"; // путь к файлу каталог_данных_терминала\MQL4\Images\euro.bmp
string dollar ="\\Images\\dollar.bmp"; // путь к файлу каталог_данных_терминала\MQL4\Images\dollar.bmp
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- создадим кнопку OBJ_BITMAP_LABEL, если ее еще нет
if(ObjectFind(0,label_name)<0)
{
//--- попробуем создать объект OBJ_BITMAP_LABEL
bool created=ObjectCreate(0,label_name,OBJ_BITMAP_LABEL,0,0,0);
if(created)
{
//--- привяжем кнопку к правому верхнему углу графика
ObjectSetInteger(0,label_name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
//--- теперь настроим свойства объекта
ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,50);
//--- сбросим код последней ошибки в 0
ResetLastError();
//--- загрузим картинку для состояния кнопки "Нажата"
bool set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,0,euro);
//--- проверим результат
if(!set)
{
PrintFormat("Не удалось загрузить картинку из файла %s. Код ошибки %d",euro,GetLastError());
}
ResetLastError();
//--- загрузим картинку для состояния кнопки "Отжата"
set=ObjectSetString(0,label_name,OBJPROP_BMPFILE,1,dollar);

if(!set)
{
PrintFormat("Не удалось загрузить картинку из файла %s. Код ошибки %d",dollar,GetLastError());
}
//--- отдадим графику команду на обновление, чтобы кнопка появилась сразу же, не дожидаясь тика
ChartRedraw(0);
}
else
{
//--- объект создать не удалось, сообщим об этом
PrintFormat("Не удалось создать объект OBJ_BITMAP_LABEL. Код ошибки %d",GetLastError());
}
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- удалим объект с графика
ObjectDelete(0,label_name);
}

Создание и настройка графического объекта с именем currency_label происходят в функции OnInit(). Пути к загружаемым графическим файлам заданы в глобальных переменных euro и dollar, в качестве разделителя использована двойная обратная косая черта:

string euro ="\\Images\\euro.bmp"; // путь к файлу каталог_данных_терминала\MQL4\Images\euro.bmp
string dollar ="\\Images\\dollar.bmp"; // путь к файлу каталог_данных_терминала\MQL4\Images\dollar.bmp

Сами файлы при этом находятся в папке каталог_данных_терминала\MQL4\Images.

Объект OBJ_BITMAP_LABEL фактически представляет собою кнопку, которая в зависимости от состояния (нажата или отжата) может отображать одну из двух картинок: euro.bmp или dollar.bmp.

Свойства объекта OBJ_BITMAP_LABEL

Размеры кнопки с графическим интерфейсом автоматически устанавливаются под размер отображаемой картинки. Смена изображения производится при нажатии левой кнопкой мышки на объекте OBJ_BITMAP_LABEL (в свойствах должен быть выбрано "Отключить выделение"). Объект OBJ_BITMAP создается аналогичным образом и предназначен для создания фона с требуемым рисунком.

Значение свойства OBJPROP_BMPFILE, которое отвечает за вид объектов OBJ_BITMAP и OBJ_BITMAP_LABEL, можно менять динамически. Это позволяет создавать разнообразные интерактивные пользовательские интерфейсы для mql4-программ.

Включение ресурсов в исполняемые файлы при компиляции mql4-программ

Для работы mql4-программы может потребоваться множество разнообразных загружаемых ресурсов в виде файлов изображений и звуков. Для того чтобы исключить необходимость переноса всех этих файлов при передаче исполняемой программы на MQL4, следует использовать директиву компилятора #resource:

#resource путь_к_файлу_ресурса

Команда #resource указывает компилятору, что ресурс по указанному пути путь_к_файлу_ресурса нужно включить в исполняемый файл EX4. Таким образом, все необходимые картинки и звуки можно поместить непосредственно в EX4-файл и для запуска программы в другом терминале не потребуется передавать все используемые в ней отдельные файлы. Любой EX4-файл может содержать ресурсы, и любая EX4-программа может использовать ресурсы из другой EX4-программы.

Файлы в формате BMP и WAV перед включением в исполняемый EX4 файл автоматически сжимаются. Это означает, что использование ресурсов не только позволяет создавать полноценные программы на MQL4, но и уменьшает общий размер требуемых терминалу файлов при использовании графики и звука по сравнению с обычным способом написания mql4-программ.

Размер файла ресурса не может быть больше 16 Mb.

Поиск компилятором указанных ресурсов

Ресурс вставляется командой #resource "<путь к файлу ресурса>"

#resource "<путь_к_файлу_ресурса>"

Длина константной строки <путь_к_файлу_ресурса> не должна превышать 63 символа.

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

Компилятор ищет ресурс по указанному пути в следующей последовательности:

  • если в начале пути стоит разделитель обратная косая черта "\" (пишется "\\"), то ресурс ищется относительно каталога каталог_данных_терминала\MQL4\,
  • если обратной косой черты нет, то ресурс ищется относительно расположения исходного файла, в котором этот ресурс прописывается.

В пути ресурса недопустимо использовать подстроки "..\\" и ":\\".

Примеры включения ресурсов:

//--- правильное указание ресурсов
#resource "\\Images\\euro.bmp" // euro.bmp находится в каталог_данных_терминала\MQL4\Images\
#resource "picture.bmp" // picture.bmp находится в том же каталоге, где и исходный файл
#resource "Resource\\map.bmp" // ресурс находится в папке каталог_исходного_файла\Resource\map.bmp

//--- неправильное указание ресурсов
#resource ":picture_2.bmp" // нельзя использовать ":"
#resource "..\\picture_3.bmp" // нельзя использовать ".."
#resource "\\Files\\Images\\Folder_First\\My_panel\\Labels\\too_long_path.bmp" //больше 63 символов

Использование ресурсов

Имя ресурса

После того как ресурс объявлен директивой #resource, его можно использовать в любой части программы. Именем ресурса становится его путь без косой черты в начале строки, задающей путь к ресурсу. Для использования своего ресурса в коде нужно перед именем ресурса добавлять специальный признак "::".

Примеры:

//--- примеры указания ресурсов и их имена в комментарии
#resource "\\Images\\euro.bmp" // имя ресурса - Images\euro.bmp
#resource "picture.bmp" // имя ресурса - picture.bmp
#resource "Resource\\map.bmp" // имя ресурса - Resource\map.bmp
#resource "\\Files\\Pictures\\good.bmp" // имя ресурса - Files\Pictures\good.bmp
#resource "\\Files\\Demo.wav"; // имя ресурса - Files\Demo.wav"
#resource "\\Sounds\\thrill.wav"; // имя ресурса - Sounds\thrill.wav"
...

//--- использование ресурсов
ObjectSetString(0,bitmap_name,OBJPROP_BMPFILE,0,"::Images\\euro.bmp");
...
ObjectSetString(0,my_bitmap,OBJPROP_BMPFILE,0,"::picture.bmp");
...
set=ObjectSetString(0,bitmap_label,OBJPROP_BMPFILE,1,"::Files\\Pictures\\good.bmp");
...
PlaySound("::Files\\Demo.wav");
...
PlaySound("::Sounds\\thrill.wav");

Необходимо отметить, что при установке объектам OBJ_BITMAP и OBJ_BITMAP_LABEL изображения из ресурса, значение свойства OBJPROP_BMPFILE уже нельзя менять вручную. Например, пусть мы используем для создания OBJ_BITMAP_LABEL ресурсы файлов euro.bmp и dollar.bmp.

#resource "\\Images\\euro.bmp"; // euro.bmp находится в каталог_данных_терминала\MQL4\Images\
#resource "\\Images\\dollar.bmp"; // dollar.bmp находится в каталог_данных_терминала\MQL4\Images\

Тогда при просмотре свойств этого объекта мы увидим, что свойства BitMap File (On) и BitMap File (Off) имеют серый цвет и недоступны для изменения вручную:

Использование ресурсов других mql4-программ

Использование ресурсов имеет и другое преимущество – в любой mql4-программе можно использовать ресурсы из любого файла EX4. Таким образом, ресурсы из одного файла EX4 можно использовать во многих других mql4-программах.

Для того чтобы использовать имя ресурса из стороннего файла, его нужно указать в виде <путь_имя_файла_EX4>::<имя_ресурса>. Например, пусть в скрипте Draw_Triangles_Script.mq5 указан ресурс на картинку в файле triangle.bmp:

#resource "\\Files\\triangle.bmp"

Тогда его имя для использования в самом скрипте будет выглядеть как "Files\triangle.bmp", а для использования к имени ресурса нужно добавить специальный признак "::".

//--- использование ресурса в самом скрипте
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"::Files\\triangle.bmp");

Чтобы использовать этот же ресурс из другой программы, например, эксперта, нужно к имени ресурса дополнительно добавить путь к EX4-файлу относительно папки каталог_данных_терминала\MQL4\ и имя EX4-файла этого скрипта - Draw_Triangles_Script.ex4. Пусть скрипт лежит в стандартной папке каталог_данных_терминала\MQL4\Scripts\, тогда вызов нужно написать таким образом:

//--- использование ресурса скрипта в эксперте
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"\\Scripts\\Draw_Triangles_Script.ex4::Files\\triangle.bmp");

Если при обращении к ресурсу в другом EX4-файле не указать путь к этому исполняемому файлу, то исполняемый файл ищется в той же папке, где находится и обратившаяся за ресурсом программа. Это означает, что если в советнике запрашивается ресурс из файла Draw_Triangles_Script.ex4 без указания пути, например, так:

//--- запрос ресурса скрипта в эксперте без указания пути
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"Draw_Triangles_Script.ex4::Files\\triangle.bmp");

то файл будет искаться в папке каталог_данных_терминала\MQL4\Experts\, если сам советник находится в папке каталог_данных_терминала\MQL4\Experts\.

Работа с пользовательскими индикаторами, подключенными в качестве ресурсов

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

Пример подключения и использования пользовательского индикатора SampleIndicator.ex4, расположенного в папке: каталог_данных_терминала\MQL4\Indicators\:

//+------------------------------------------------------------------+
//| SampleEA.mq4 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\SampleIndicator.ex4"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- получим значение пользовательского индикатора
double value=iCustom(_Symbol,_Period,"::Indicators\\SampleIndicator.ex4",0,0);
PrintFormat("Indicator: iCustom value=%f",value);
//--- ...
return(INIT_SUCCEEDED);
}

Случай, когда пользовательский индикатор в функции OnInit() создает одну или несколько копий себя, требует отдельного рассмотрения. Напомним, что для использования ресурса из mql4-программы его необходимо указывать в виде: <путь_имя_файла_EX4>::<имя_ресурса>.

Например, если индикатор SampleIndicator.ex4 включается в советник SampleEA.ex4 в качестве ресурса, то путь к самому себе, указанный при вызове iCustom() в функции инициализации пользовательского индикатора, будет выглядеть следующим образом: "\\Experts\\SampleEA.ex4::Indicators\\SampleIndicator.ex4". При явном указании данного пути пользовательский индикатор SampleIndicator.ex4 будет жестко привязан к советнику SampleEA.ex4 и теряет способность самостоятельной работы.

Путь до самого себя можно получить при помощи функции GetRelativeProgramPath(), пример использования которой приведен ниже:

//+------------------------------------------------------------------+
//| SampleIndicator.mq4 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_separate_window
int handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- неправильный способ указания ссылки на себя
//--- string path="\\Experts\\SampleEA.ex4::Indicators\\SampleIndicator.ex4";
//--- правильный способ получения ссылки на себя
string path=GetRelativeProgramPath();
double value=iCustom(_Symbol,_Period,path,0,0);
PrintFormat("Path=%s, iCustom value=%f",path,value);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| GetRelativeProgramPath |
//+------------------------------------------------------------------+
string GetRelativeProgramPath()
{
int pos2;
//--- получаем абсолютный путь к программе
string path=MQLInfoString(MQL_PROGRAM_PATH);
//--- находим позицию подстроки "\MQL4\"
int pos =StringFind(path,"\\MQL4\\");
//--- подстрока не найдена - ошибка
if(pos<0)
return(NULL);
//--- пропускаем каталог "\MQL4"
pos+=5;
//--- пропускаем лишние '\'
while(StringGetCharacter(path,pos+1)=='\\')
pos++;
//--- если это ресурс, возвращаем путь относительно MQL4-каталога
if(StringFind(path,"::",pos)>=0)
return(StringSubstr(path,pos));
//--- найдем разделитель для первого подкаталога в MQL4 (например, MQL4\Indicators)
//--- если его нет, то вернем путь относительно MQL4-каталога
if((pos2=StringFind(path,"\\",pos+1))<0)
return(StringSubstr(path,pos));
//--- вернем путь относительно подкаталога (например, MQL4\Indicators)
return(StringSubstr(path,pos2+1));
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double& price[])
{
//--- return value of prev_calculated for next call
return(rates_total);
}

Смотри также

ResourceCreate(), ResourceSave(), PlaySound(), ObjectSetInteger(), ChartApplyTemplate(), Файловые операции


Вызов импортируемых функций

Справочник MQL4 / Программы MQL4 / Вызов импортируемых функций

Вызов импортируемых функций

Для импорта функций во время выполнения mql4-программы используется раннее связывание. Это значит, что если в программе есть вызов импортируемой функции, то соответствующий модуль (ex4 или dll) загружается в процессе загрузки программы. Библиотеки MQL4 и DLL выполняются в потоке вызывающего модуля.

Не рекомендуется использовать полностью квалифицированное имя загружаемого модуля вида Drive:\Directory\FileName.Ext. Библиотеки MQL4 загружаются из папки terminal_dir\MQL4\Libraries. Если библиотека не была найдена, то производится попытка загрузить библиотеку из папки terminal_dir\experts.

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

  1. Директория из которой был запущен модуль, импортирующий dll. Под модулем понимается эксперт, скрипт, индикатор или библиотека EX4;
  2. Директория каталог_данных_терминала\MQL4\Libraries (TERMINAL_DATA_PATH\MQL4\Libraries);
  3. Директория, из которой был запущен клиентский терминал MetaTrader 4;
  4. Системная директория;
  5. Директория Windows;
  6. Текущая директория;
  7. Директории, перечисленные в системной переменной PATH.

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

Перед загрузкой эксперта (скрипта, индикатора) формируется общий список всех библиотечных модулей EX4, которые предполагается использовать как из загружаемого эксперта (скрипта, индикатора), так и из библиотек из этого списка. Таким образом обеспечивается однократная загрузка многократно используемых библиотечных модулей EX4. Библиотеки пользуются предопределенными переменными вызвавшего их эксперта (скрипта, индикатора).

Поиск импортируемой библиотеки EX4 производится в следующей последовательности:

  1. Директория, путь к которой задается относительно директории импортирующего EX4 эксперта (скрипта, индикатора);
  2. Директория каталог_терминала\MQL4\Libraries;
  3. Директория MQL4\Libraries в общей директории всех клиентских терминалов MetaTrader 4 (Common\MQL4\Libraries).

Функции, импортируемые из DLL в mql4-программу, должны обеспечивать соглашение о связях, принятое для функций Windows API. Для обеспечения такого соглашения в исходном тексте программ, написанных на языках C или C++, используется ключевое слово __stdcall, которое является специфическим для компиляторов от фирмы Microsoft(r). Обсуждаемое соглашение о связях характеризуется следующим:

  • вызывающая функция (в нашем случае mql4-программа) должна "видеть" прототип вызываемой (импортируемой из DLL) функции, для того чтобы правильно сложить параметры на стек;
  • вызывающая функция (в нашем случае mql4-программа) складывает параметры на стек в обратном порядке, справа налево - именно в таком порядке импортируемая функция считывает переданные ей параметры;
  • параметры передаются по значению, за исключением тех, которые явно передаются по ссылке (в нашем случае строк);
  • импортируемая функция, считывая переданные ей параметры, сама очищает стек.

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

В случае если соответствующая библиотека не смогла загрузиться, либо установлен запрет на использование DLL, либо импортируемая функция не была найдена – эксперт останавливает свою работу с соответствующим сообщением "expert stopped" в журнале. При этом эксперт не будет запускаться, пока не будет заново проинициализирован. Эксперт может быть переинициализирован в результате перекомпиляции либо после открытия таблицы свойств эксперта и нажатия кнопки OK.

Передача параметров

Все параметры простых типов передаются по значению, если явно не указано, что они передаются по ссылке. При передаче строки передается адрес буфера скопированной строки; если строка передается по ссылке, то в функцию, импортируемую из DLL, передается адрес буфера именно этой строки без копирования.

Структуры, содержащие динамические массивы, строки, классы, другие сложные структуры, а также статические либо динамические массивы перечисленных объектов, не могут быть переданы в качестве параметра в импортируемую функцию.

При передаче в DLL массива всегда (независимо от флага AS_SERIES) передается адрес начала буфера данных. Функция внутри DLL ничего не знает о флаге AS_SERIES, переданный массив является статическим массивом неизвестной длины, для указания размера массива используйте дополнительный параметр.


Ошибки выполнения

Справочник MQL4 / Программы MQL4 / Ошибки выполнения

Ошибки выполнения

В исполняющей подсистеме клиентского терминала существует возможность сохранения кода ошибки в случае ее возникновения при выполнении mql4-программы. Для каждой исполняемой mql4-программы предусмотрена предопределенная переменная _LastError.

Перед запуском функции OnInit переменная _LastError обнуляется. При возникновении ошибочной ситуации во время вычислений или в процессе вызова встроенной функции переменная _LastError принимает соответствующий код ошибки. Значение, сохраненное в этой переменной, можно получить при помощи функции GetLastError().

Существует ряд критических ошибок, при возникновении которых выполнение программы немедленно прерывается:

  • деление на ноль;
  • выход за пределы массива;
  • использование некорректного указателя объекта;


Особенности работы программ в тестере стратегий

Справочник MQL4 / Программы MQL4 / Особенности работы программ в тестере стратегий

Особенности работы программ в тестере стратегий

Тестер стратегий торгового терминала MetaTrader 4 позволяет протестировать работу советника на исторических данных.

При тестировании советника следует учитывать особенности тестирования и оптимизации программ в тестере стратегий:

  • Ограничения работы функций в тестере торговых стратегий
  • Глобальные переменные клиентского терминала
  • Моделирование времени в тестере
  • Графические объекты при тестировании
  • Обработка событий в тестере

Ограничения работы функций в тестере торговых стратегий

Существуют ограничения работы некоторых функций в тестере стратегий клиентского терминала, их вызов приведет к ошибке 4059 (Функция не разрешена в тестовом режиме).

Функция Sleep()

Функция Sleep() в тестере стратегий не вызывает никаких задержек.

Функции Print() и PrintFormat()

Для увеличения быстродействия при оптимизации параметров советника функции Print() и PrintFormat() не выполняются. Исключением является использование этих функций внутри обработчика OnInit(). Это позволяет облегчить поиск причин ошибок при их возникновении.

Функции Alert(), MessageBox(), PlaySound(), SendFTP, SendMail(), SendNotification(), WebRequest()

Функции взаимодействия с "внешним миром" Alert(), MessageBox(), PlaySound(), SendFTP(), SendMail(), SendNotification() и WebRequest() в тестере стратегий не выполняются.

The OrderSend(), OrderModify(), OrderDelete(), OrderClose(), OrderCloseBy() Functions

Торговые операции по инструментам, отличным от тестируемого символа, не производятся.

Глобальные переменные клиентского терминала

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

Моделирование времени в тестере

При тестировании производится моделирование времени в соответствии с историческими данными. Локальное время TimeLocal() всегда равно серверному времени TimeCurrent(). В свою очередь, серверное время всегда равно времени, соответствующему времени GMT - TimeGMT(). Таким образом, все эти функции при тестировании выдают одно и то же время.

Отсутствие разницы между GMT, локальным и серверным временем в тестере сделано сознательно по той самой причине, что связь с сервером может быть не всегда. А результаты тестирования должны быть одинаковыми, независимо от наличия связи. Информация о серверном времени не хранится локально, а берётся с сервера.

Графические объекты при тестировании

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

Обработка событий в тестере

В тестере стратегий реализована обработка следующих событий: инициализация советника перед одиночным прогоном OnInit(), деинициализация советника после одиночного прогона OnDeInit(), моделирование нового тика OnTick().

Кроме того, по окончании тестирования эксперта на исторических данных перед вызовом функции деинициализации OnDeInit() генерируется событие Tester, обработка которого осуществляется в функции OnTester(). Значение, возвращаемое данной функцией, используется в качестве критерия Custom max при оптимизации входных параметров.

Обработка событий Timer и ChartEvent в тестере стратегий не поддерживается.

Ограничения торговых операций

Торговые операции по инструментам, отличным от тестируемого символа, не производятся.


Предопределенные переменные

Справочник MQL4 / Предопределенные переменные

Предопределенные переменные

Для каждой выполняющейся mql4-программы поддерживается ряд предопределенных переменных, которые отражают состояние текущего ценового графика на момент запуска программы - эксперта, скрипта или пользовательского индикатора.

Значение предопределенным переменным устанавливает клиентский терминал перед запуском mql4-программы на выполнение. Предопределенные переменные константны и не могут быть изменены из mql4-программы. Исключение составляет переменная _LastError, которая может быть обнулена функцией ResetLastError.

Переменная | Значение
_Digits | Количество десятичных знаков после запятой
_Point | Размер пункта текущего инструмента в валюте котировки
_LastError | Значение последней ошибки
_Period | Значение таймфрейма текущего графика
_RandomSeed | Текущее состояние генератора псевдослучайных целых чисел
_StopFlag | Флаг остановки программы
_Symbol | Имя символа текущего графика
_UninitReason | Код причины деинициализации программы
Ask | Последняя известная цена продажи текущего инструмента
Bars | Количество баров на текущем графике
Bid | Последняя известная цена покупки текущего инструмента
Close | Массив-таймсерия, содержащий цены закрытия каждого бара текущего графика
Digits | Количество цифр после десятичной точки в цене текущего инструмента
High | Массив-таймсерия, содержащий максимальные цены каждого бара текущего графика
Low | Массив-таймсерия, содержащий минимальные цены каждого бара текущего графика
Open | Массив-таймсерия, содержащий цены открытия каждого бара текущего графика
Point | Размер пункта текущего инструмента в валюте котировки
Time | Массив-таймсерия, содержащий время открытия каждого бара текущего графика
Volume | Массив-таймсерия, содержащий тиковые объемы каждого бара текущего графика

Предопределенные переменные не могут быть определены в библиотеке. Библиотека использует эти переменные, определенные в программе, из которой эта библиотека была вызвана.

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
Print("Имя символа текущего графика=",_Symbol);
Print("Значение таймфрейма текущего графика=",_Period);
Print("Последняя известная цена продажи текущего инструмента=",Ask);
Print("Последняя известная цена покупки текущего инструмента=",Bid);
Print("Количество десятичных знаков после запятой=",Digits);
Print("Количество десятичных знаков после запятой=",_Digits);
Print("Размер пункта текущего инструмента в валюте котировки=",_Point);
Print("Размер пункта текущего инструмента в валюте котировки=",Point);
Print("Количество баров на текущем графике=",Bars);
Print("Цена открытия текущего бара текущего графика=",Open[0]);
Print("Цена закрытия текущего бара текущего графика=",Close[0]);
Print("Максимальная цена текущего бара текущего графика=",High[0]);
Print("Минимальная цена текущего бара текущего графика=",Low[0]);
Print("Время открытия текущего бара текущего графика=",Time[0]);
Print("Тиковый объем текущего бара текущего графика=",Volume[0]);
Print("Значение последней ошибки=",_LastError);
Print("Текущее состояние генератора псевдослучайных целых чисел=",_RandomSeed);
Print("Флаг остановки программы=",_StopFlag);
Print("Код причины деинициализации программы=",_UninitReason);
}


_Digits

Справочник MQL4 / Предопределенные переменные / _Digits

int _Digits

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

Можно также использовать функцию Digits().


_Point

Справочник MQL4 / Предопределенные переменные / _Point

double _Point

В переменной _Point хранится размер пункта текущего инструмента в валюте котировки.

Можно также использовать функцию Point().


_LastError

Справочник MQL4 / Предопределенные переменные / _LastError

int _LastError

В переменной _LastError хранится значение последней ошибки, произошедшей во время исполнения mql4-программы. Сбросить значение в ноль можно функцией ResetLastError().

Для получения кода ошибки можно также использовать функцию GetLastError().


_Period

Справочник MQL4 / Предопределенные переменные / _Period

int _Period

В переменной _Period хранится значение таймфрейма текущего графика.

Можно также использовать функцию Period().

Смотри также

PeriodSeconds, Периоды графиков, Дата и время, Видимость объектов


_RandomSeed

Справочник MQL4 / Предопределенные переменные / _RandomSeed

_RandomSeed

Переменная для хранения текущего состояния при генерации псевдослучайных целых чисел. _RandomSeed меняет своё значение при вызове MathRand(). Для установки нужного начального состояния используйте MathSrand().

Случайное число x, получаемое функцией MathRand(), вычисляется при каждом вызове следующим образом:

x=_RandomSeed*214013+2531011;
_RandomSeed=x;
x=(x>>16)&0x7FFF;

Смотри также

MathRand(), MathSrand(), Целые типы


_StopFlag

Справочник MQL4 / Предопределенные переменные / _StopFlag

bool _StopFlag

В переменной _StopFlag хранится флаг остановки mql4-программы. Когда клиентский терминал пытается остановить программу, в эту переменную записывается значение true.

Для проверки значения флага _StopFlag можно также использовать функцию IsStopped().


_Symbol

Справочник MQL4 / Предопределенные переменные / _Symbol

string _Symbol

В переменной _Symbol хранится имя символа текущего графика.

Можно также использовать функцию Symbol().


_UninitReason

Справочник MQL4 / Предопределенные переменные / _UninitReason

int _UninitReason

В переменной _UninitReason хранится код причины деинициализации программы.

Обычно код причины деинициализации получают с помощью функции UninitializeReason().


Ask

Справочник MQL4 / Предопределенные переменные / Ask

double Ask

Последняя известная цена продажи (запрашиваемая цена) текущего инструмента. Для обновления необходимо использовать функцию RefreshRates().

См. также MarketInfo().

Пример:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25)
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,
"Order Buy #2",3,D'2005.10.10 12:30',Red);
return;
}


Bars

Справочник MQL4 / Предопределенные переменные / Bars

int Bars

Количество баров на текущем графике.

Пример:

int counter=1;
for(int i=1; i<=Bars; i++)
{
Print(Close[i-1]);
}

Смотри также

Функция Bars, iBars


Bid

Справочник MQL4 / Предопределенные переменные / Bid

double Bid

Последняя известная цена покупки (предложение на покупку) текущего инструмента. Для обновления необходимо использовать функцию RefreshRates().

См. также MarketInfo().

Пример:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,
"My order #2",3,D'2005.10.10 12:30',Red);
return(0);
}


Close

Справочник MQL4 / Предопределенные переменные / Close

double Close[]

Массив-таймсерия, содержащий цены закрытия каждого бара текущего графика.

Индексация элементов таймсерий производится задом наперед, от последнего к первому. Текущий бар, самый последний в массиве, имеет индекс 0. Самый старый бар, первый на графике, имеет индекс Bars-1.

См. также iClose().

Пример:

int handle = FileOpen("file.csv", FILE_CSV|FILE_WRITE, ";");
if(handle>0)
{
// запись заголовков столбцов таблицы
FileWrite(handle, "Time;Open;High;Low;Close;Volume");
// запись данных
for(int i=0; i<Bars; i++)
FileWrite(handle, Time[i], Open[i], High[i], Low[i], Close[i], Volume[i]);
FileClose(handle);
}


Digits

Справочник MQL4 / Предопределенные переменные / Digits

int Digits

Количество цифр после десятичной точки в цене текущего инструмента.

См. также MarketInfo().

Пример:

Print(DoubleToStr(Close[0], Digits));


High

Справочник MQL4 / Предопределенные переменные / High

double High[]

Массив-таймсерия, содержащий максимальные цены каждого бара текущего графика.

Индексация элементов таймсерий производится задом наперед, от последнего к первому. Текущий бар, самый последний в массиве, имеет индекс 0. Самый старый бар, первый на графике, имеет индекс Bars-1.

См. также iHigh().

Пример:

//---- maximums counting
i=Bars-KPeriod;
if(counted_bars>KPeriod) i=Bars-counted_bars-1;
while(i>=0)
{
double max=-1000000;
k=i+KPeriod-1;
while(k>=i)
{
price=High[k];
if(max<price) max=price;
k--;
}
HighesBuffer[i]=max;
i--;
}
//----


Low

Справочник MQL4 / Предопределенные переменные / Low

double Low[]

Массив-таймсерия, содержащий минимальные цены каждого бара текущего графика.

Индексация элементов таймсерий производится задом наперед, от последнего к первому. Текущий бар, самый последний в массиве, имеет индекс 0. Самый старый бар, первый на графике, имеет индекс Bars-1.

См. также iLow().

Пример:

//---- minimums counting
i=Bars-KPeriod;
if(counted_bars>KPeriod) i=Bars-counted_bars-1;
while(i>=0)
{
double min=1000000;
k=i+KPeriod-1;
while(k>=i)
{
price=Low[k];
if(min>price) min=price;
k--;
}
LowesBuffer[i]=min;
i--;
}
//----


Open

Справочник MQL4 / Предопределенные переменные / Open

double Open[]

Массив-таймсерия, содержащий цены открытия каждого бара текущего графика.

Индексация элементов таймсерий производится задом наперед, от последнего к первому. Текущий бар, самый последний в массиве, имеет индекс 0. Самый старый бар, первый на графике, имеет индекс Bars-1.

См. также iOpen().

Пример:

i = Bars - counted_bars - 1;
while(i>=0)
{
double high = High[i];
double low = Low[i];
double open = Open[i];
double close = Close[i];
AccumulationBuffer[i] = (close-low) - (high-close);
if(AccumulationBuffer[i] != 0)
{
double diff = high - low;
if(0==diff)
AccumulationBuffer[i] = 0;
else
{
AccumulationBuffer[i] /= diff;
AccumulationBuffer[i] *= Volume[i];
}
}
if(i<Bars-1) AccumulationBuffer[i] += AccumulationBuffer[i+1];
i--;
}


Point

Справочник MQL4 / Предопределенные переменные / Point

double Point

Размер пункта текущего инструмента в валюте котировки.

См. также MarketInfo().

Пример:

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,NormalizeDouble(Ask+TakeProfit*Point,Digits));


Time

Справочник MQL4 / Предопределенные переменные / Time

datetime Time[]

Массив-таймсерия, содержащий время открытия каждого бара текущего графика. Данные типа datetime представляют собой время в секундах, прошедшее с 00:00 1 января 1970 года.

Индексация элементов таймсерий производится задом наперед, от последнего к первому. Текущий бар, самый последний в массиве, имеет индекс 0. Самый старый бар, первый на графике, имеет индекс Bars-1.

См. также iTime().

Пример:

for(i=Bars-2; i>=0; i--)
{
if(High[i+1] > LastHigh) LastHigh = High[i+1];
if(Low[i+1] < LastLow) LastLow = Low[i+1];
//----
if(TimeDay(Time[i]) != TimeDay(Time[i+1]))
{
P = (LastHigh + LastLow + Close[i+1])/3;
R1 = P*2 - LastLow;
S1 = P*2 - LastHigh;
R2 = P + LastHigh - LastLow;
S2 = P - (LastHigh - LastLow);
R3 = P*2 + LastHigh - LastLow*2;
S3 = P*2 - (LastHigh*2 - LastLow);
LastLow = Open[i];
LastHigh = Open[i];
}
//----
PBuffer[i] = P;
S1Buffer[i] = S1;
R1Buffer[i] = R1;
S2Buffer[i] = S2;
R2Buffer[i] = R2;
S3Buffer[i] = S3;
R3Buffer[i] = R3;
}


Volume

Справочник MQL4 / Предопределенные переменные / Volume

long Volume[]

Массив-таймсерия, содержащий тиковые объемы каждого бара текущего графика.

Индексация элементов таймсерий производится задом наперед, от последнего к первому. Текущий бар, самый последний в массиве, имеет индекс 0. Самый старый бар, первый на графике, имеет индекс Bars-1.

См. также iVolume().

Пример:

if(i==0 && time0<i_time+periodseconds)
{
d_volume += Volume[0];
if(Low[0]<d_low) d_low = Low[0];
if(High[0]>d_high) d_high = High[0];
d_close = Close[0];
}
last_fpos = FileTell(ExtHandle);
last_volume = Volume[i];
FileWriteInteger(ExtHandle, i_time, LONG_VALUE);
FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE);


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

Справочник MQL4 / Общие функции

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

Функции общего назначения, которые не вошли ни в одну из специализированных групп.

Функция | Действие
Alert | Выводит сообщение в отдельном окне
CheckPointer | Возвращает тип указателя объекта
Comment | Выводит сообщение в левый верхний угол ценового графика
CryptEncode | Преобразует данные массива-источника в массив-приемник указанным методом
CryptDecode | Производит обратное преобразование данных массива
DebugBreak | Программная точка останова при отладке
ExpertRemove | Прекращает работу эксперта и выгружает его с графика
GetPointer | Возвращает указатель объекта
GetTickCount | Возвращает количество миллисекунд, прошедших с момента старта системы
GetMicrosecondCount | Возвращает количество микросекунд, прошедших с момента начала работы MQL4-программы
MessageBox | Создает и отображает окно сообщений, а также управляет им
PeriodSeconds | Возвращает количество секунд в периоде
PlaySound | Воспроизводит звуковой файл
Print | Выводит сообщение в журнал
PrintFormat | Форматирует и печатает наборы символов и значений в лог-файл в соответствие с заданным форматом
ResetLastError | Устанавливает значение предопределенной переменной _LastError в ноль
ResourceCreate | Создает ресурс изображения на основе набора данных
ResourceFree | Удаляет динамически созданный ресурс (освобождает занятую ресурсом память)
ResourceReadImage | Читает данные графического ресурса, созданного функцией ResourceCreate() или сохраненного в EX4-файле при компиляции
ResourceSave | Сохраняет ресурс в указанный файл
SendFTP | Посылает файл по адресу, указанному в окне настроек на закладке "FTP"
SendMail | Посылает электронное письмо по адресу, указанному в окне настроек на закладке "Почта"
SendNotification | Посылает Push-уведомления в мобильные терминалы, чьи MetaQuotes ID указаны на закладке "Уведомления"
Sleep | Задерживает выполнение текущего эксперта или скрипта на определенный интервал
TerminalClose | Посылает терминалу команду на завершение работы
TesterStatistics | Возвращает значение указанного статистического показателя, рассчитанного по результатам тестирования
TranslateKey | Возвращает Unicode-символ по виртуальному коду клавиши
WebRequest | Отправляет HTTP-запрос на указанный сервер
ZeroMemory | Обнуляет переменную, переданную по ссылке. Тип переменной может быть любым, исключение составляют только классы и структуры, имеющие конструкторы

Что нового в MQL5

В языке MQL5 функции SendFTP, SendMail, SendNotification перенесены в новый расширенный раздел Сетевые функции. Теперь программы могут обмениваться данными с удаленными серверами, которые включены в список разрешенных IP-адресов. Это означает, что советники на MQL5 могут устанавливать защищенные соединения между процессами с помощью протокола TCP/IP без использования сторонних DLL.


Alert

Справочник MQL4 / Общие функции / Alert

Alert

Отображает диалоговое окно, содержащее пользовательские данные.

void Alert(
argument, // первое значение
... // последующие значения
);

Параметры

argument

[in] Любые значения, разделенные запятыми. Для разделения выводимой информации на несколько строк нужно использовать символы перевода строки "\r\n". Количество параметров не может превышать 64.

Возвращаемое значение

Нет возвращаемого значения.

Примечание

Массивы нельзя передавать в функцию Alert(). Массивы должны выводиться поэлементно. Данные типа double выводятся с 8 десятичными цифрами после точки, данные типа float выводятся с 5 десятичными цифрами после точки. Для вывода вещественных чисел с другой точностью либо в научном формате необходимо использовать функцию DoubleToString().

Данные типа bool выводятся в виде строк "true" или "false". Даты выводятся в виде YYYY.MM.DD HH:MI:SS. Для вывода даты в другом формате необходимо использовать функцию TimeToString(). Данные типа color выводятся либо в виде строки R,G,B, либо в виде названия цвета, если этот цвет присутствует в наборе цветов.

При работе в тестере стратегий функция Alert() не выполняется.

Смотри также

Comment(), Print()


CheckPointer

Справочник MQL4 / Общие функции / CheckPointer

CheckPointer

Возвращает тип указателя объекта.

ENUM_POINTER_TYPE CheckPointer(
object* anyobject // указатель объекта
);

Параметры

anyobject

[in] Указатель объекта.

Возвращаемое значение

Возвращает значение из перечисления ENUM_POINTER_TYPE.

Примечание

Попытка обращения к некорректному указателю приводит к критическому завершению программы. Поэтому существует необходимость использования функции CheckPointer перед использованием указателя. Указатель может быть некорректным в следующих случаях:

  • указатель равен NULL;
  • если объект был уничтожен при помощи оператора delete.

Данную функцию можно использовать как проверку указателя на корректность. Значение, отличное от нуля, гарантирует, что по этому указателю можно получить доступ к данным.

Пример:

//+------------------------------------------------------------------+
//| Уничтожает список через уничтожение элементов |
//+------------------------------------------------------------------+
void CMyList::Destroy()
{
//--- служебный указатель для работы в цикле
CItem* item;
//--- пройдемся в цикле и попытаемся удалить динамические указатели
while(CheckPointer(m_items)!=POINTER_INVALID)
{
item=m_items;
m_items=m_items.Next();
if(CheckPointer(item)==POINTER_DYNAMIC)
{
Print("Dynamyc object ",item.Identifier()," to be deleted");
delete (item);
}
else Print("Non-dynamic object ",item.Identifier()," cannot be deleted");
}
//---
}

Смотри также

Указатели объектов, Проверка указателя объекта, Оператор уничтожения объекта delete


Comment

Справочник MQL4 / Общие функции / Comment

Comment

Выводит комментарий, определенный пользователем, в левый верхний угол графика.

void Comment(
argument, // первое значение
... // последующие значения
);

Параметры

...

[in] Любые значения, разделенные запятыми. Для разделения выводимой информации на несколько строк можно использовать символ перевода строки "\n" либо "\r\n". Количество параметров не может превышать 64. Общая длина выводимого сообщения (включая служебные неотображаемые символы) не может превышать 2045 символов (лишние символы будут обрезаны при выводе).

Возвращаемое значение

Нет возвращаемого значения.

Примечание

Массивы нельзя передавать в функцию Comment(). Массивы должны печататься поэлементно.

Данные типа double выводятся с точностью до 16 десятичных цифр после точки, при этом данные могут выводиться либо в традиционном либо в научном формате – в зависимости от того, как запись будет наиболее компактна. Данные типа float выводятся с 5 десятичными цифрами после точки. Для вывода вещественных чисел с другой точностью либо в явно указанном формате необходимо использовать функцию DoubleToString().

Данные типа bool выводятся в виде строк "true" или "false". Даты выводятся в виде YYYY.MM.DD HH:MI:SS. Для вывода даты в другом формате необходимо использовать функцию TimeToString(). Данные типа color выводятся либо в виде строки R,G,B, либо в виде названия цвета, если этот цвет присутствует в наборе цветов.

Пример:

void OnTick()
{
//---
double Ask,Bid;
int Spread;
Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
//--- Выведем значения в три строчки
Comment(StringFormat("Выводим цены\nAsk = %G\nBid = %G\nSpread = %d",Ask,Bid,Spread));
}

Смотри также

Alert(), Print()


CryptEncode

Справочник MQL4 / Общие функции / CryptEncode

CryptEncode

Преобразует данные массива-источника в массив-приемник указанным методом.

int CryptEncode(
ENUM_CRYPT_METHOD method, // метод преобразования
const uchar& data[], // массив-источник
const uchar& key[], // ключ шифрования
uchar& result[] // массив-приемник
);

Параметры

method

[in] Метод преобразования. Может быть одним из значений перечисления ENUM_CRYPT_METHOD.

data[]

[in] Массив-источник.

key[]

[in] Ключ шифрования.

result[]

[out] Массив-приемник.

Возвращаемое значение

Количество байт в массиве-приемнике или 0 в случае ошибки. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

//+------------------------------------------------------------------+
//| ArrayToHex |
//+------------------------------------------------------------------+
string ArrayToHex(uchar &arr[],int count=-1)
{
string res="";
//--- проверка размера
if(count<0 || count>ArraySize(arr))
count=ArraySize(arr);
//--- преобразование в шестнадцатиричную строку
for(int i=0; i<count; i++)
res+=StringFormat("%.2X",arr[i]);
//---
return(res);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string text="The quick brown fox jumps over the lazy dog";
string keystr="ABCDEFG";
uchar src[],dst[],key[];
//--- подготовка ключа шифрования
StringToCharArray(keystr,key);
//--- подготовка исходного массива src[]
StringToCharArray(text,src);
//--- вывод исходных данных
PrintFormat("Initial data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
//--- шифрование массива src[] методом DES с 56-битным ключом key[]
int res=CryptEncode(CRYPT_DES,src,key,dst);
//--- проверка результата шифрования
if(res>0)
{
//--- вывод шифрованных данных
PrintFormat("Encoded data: size=%d %s",res,ArrayToHex(dst));
//--- расшифровка данных массива dst[] методом DES с 56-битным ключом key[]
res=CryptDecode(CRYPT_DES,dst,key,src);
//--- проверка результата
if(res>0)
{
//--- вывод дешифрованных данных
PrintFormat("Decoded data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
}
else
Print("Ошибка в CryptDecode. Код ошибки=",GetLastError());
}
else
Print("Ошибка в CryptEncode. Код ошибки=",GetLastError());
}

Смотри также

Операции с массивами, CryptDecode()


CryptDecode

Справочник MQL4 / Общие функции / CryptDecode

CryptDecode

Производит обратное преобразование данных массива, полученного при помощи функции CryptEncode().

int CryptDecode(
ENUM_CRYPT_METHOD method, // метод преобразования
const uchar& data[], // массив-источник
const uchar& key[], // ключ шифрования
uchar& result[] // массив-приемник
);

Параметры

method

[in] Метод преобразования. Может быть одним из значений перечисления ENUM_CRYPT_METHOD.

data[]

[in] Массив-источник.

key[]

[in] Ключ шифрования.

result[]

[out] Массив-приемник.

Возвращаемое значение

Количество байт в массиве-приемнике или 0 в случае ошибки. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Смотри также

Операции с массивами, CryptEncode()


DebugBreak

Справочник MQL4 / Общие функции / DebugBreak

DebugBreak

Программная точка останова при отладке.

void DebugBreak();

Возвращаемое значение

Нет возвращаемого значения.

Примечание

Прерывание выполнения mql4-программы происходит только в том случае, если программа запущена в режиме отладки. Функцию можно использовать для просмотра значений переменных и/или дальнейшего пошагового выполнения.


ExpertRemove

Справочник MQL4 / Общие функции / ExpertRemove

ExpertRemove

Прекращает работу эксперта и выгружает его с графика.

void ExpertRemove();

Возвращаемое значение

Нет возвращаемого значения.

Примечание

Остановка эксперта не происходит немедленно при вызове функции ExpertRemove(), производится лишь взвод флага для прекращения работы эксперта. Т.е., любое следующее событие эксперт обрабатывать уже не будет, произойдет вызов OnDeinit() и выгрузка с удалением с графика.

Пример:

//+------------------------------------------------------------------+
//| Test_ExpertRemove.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
input int ticks_to_close=20;// количество тиков до снятия эксперта
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Print(TimeCurrent(),": " ,__FUNCTION__," reason code = ",reason);
//--- "clear" comment
Comment("");
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
static int tick_counter=0;
//---
tick_counter++;
Comment("\nДо выгрузки эксперта ",__FILE__," осталось ",
(ticks_to_close-tick_counter)," тиков ");
//--- до
if(tick_counter>=ticks_to_close)
{
ExpertRemove();
Print(TimeCurrent(),": ",__FUNCTION__," эксперт будет выгружен");
}
Print("tick_counter = ",tick_counter);
//---
}
//+------------------------------------------------------------------+

Смотри также

Выполнение программ, События клиентского терминала


GetPointer

Справочник MQL4 / Общие функции / GetPointer

GetPointer

Возвращает указатель объекта.

void* GetPointer(
any_class anyobject // объект любого класса
);

Параметры

anyobject

[in] Объект любого класса.

Возвращаемое значение

Возвращает указатель объекта.

Примечание

Только объекты классов имеют указатели. Экземпляры структур и переменные простых типов указателей не имеют. Объект класса, который не создан при помощи оператора new(), а например, автоматически созданный в массиве объектов, все равно имеет указатель. Только этот указатель будет иметь автоматический тип POINTER_AUTOMATIC, и к нему нельзя применить оператор delete(). В остальном указатель типа ничем не отличается от динамических указателей типа POINTER_AUTOMATIC.

Так как переменные типа структур и простых типов не имеют указателей, то применять к ним функцию GetPointer() запрещено. Также запрещается в качества аргумента функции передавать указатель. Во всех перечисленных случаях компилятор сообщит об ошибке.

Попытка к обращения к некорректному указателю приводит к критическому завершению программы. Поэтому существует необходимость использования функции CheckPointer() перед использованием указателя. Указатель может быть некорректным в следующих случаях:

  • указатель равен NULL;
  • если объект был уничтожен при помощи оператора delete.

Данную функцию можно использовать как проверку указателя на корректность. Значение, отличное от нуля, гарантирует, что по этому указателю можно получить доступ к данным.

Пример:

//+------------------------------------------------------------------+
//| Check_GetPointer.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"

//+------------------------------------------------------------------+
//| Класс, реализующий элемент списка |
//+------------------------------------------------------------------+
class CItem
{
int m_id;
string m_comment;
CItem* m_next;
public:
CItem() { m_id=0; m_comment=NULL; m_next=NULL; }
~CItem() { Print("Destructor of ",m_id,
(CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
"dynamic":"non-dynamic"); }
void Initialize(int id,string comm) { m_id=id; m_comment=comm; }
void PrintMe() { Print(__FUNCTION__,":",m_id,m_comment); }
int Identifier() { return(m_id); }
CItem* Next() {return(m_next); }
void Next(CItem *item) { m_next=item; }
};
//+------------------------------------------------------------------+
//| Простейший класс списка |
//+------------------------------------------------------------------+
class CMyList
{
CItem* m_items;
public:
CMyList() { m_items=NULL; }
~CMyList() { Destroy(); }
bool InsertToBegin(CItem* item);
void Destroy();
};
//+------------------------------------------------------------------+
//| Вставляет элемент списка в самое начало |
//+------------------------------------------------------------------+
bool CMyList::InsertToBegin(CItem* item)
{
if(CheckPointer(item)==POINTER_INVALID) return(false);
//---
item.Next(m_items);
m_items=item;
//---
return(true);
}
//+------------------------------------------------------------------+
//| Уничтожает список через уничтожение элементов |
//+------------------------------------------------------------------+
void CMyList::Destroy()
{
//--- служебный указатель для работы в цикле
CItem* item;
//--- пройдемся в цикле и попытаемся удалить динамические указатели
while(CheckPointer(m_items)!=POINTER_INVALID)
{
item=m_items;
m_items=m_items.Next();
if(CheckPointer(item)==POINTER_DYNAMIC)
{
Print("Dynamyc object",item.Identifier(),"to be deleted");
delete (item);
}
else Print("Non-dynamic object",item.Identifier(),"cannot be deleted");
}
//---
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
CMyList list;
CItem items[10];
CItem* item;
//--- создадим и добавим в список динамический указатель объекта
item=new CItem;
if(item!=NULL)
{
item.Initialize(100,"dynamic");
item.PrintMe();
list.InsertToBegin(item);
}
//--- добавим автоматические указатели в список
for(int i=0; i<10; i++)
{
items[i].Initialize(i,"automatic");
items[i].PrintMe();
item=GetPointer(items[i]);
if(CheckPointer(item)!=POINTER_INVALID)
list.InsertToBegin(item);
}
//--- добавим еще один динамический указатель объекта в начало списка
item=new CItem;
if(item!=NULL)
{
item.Initialize(200,"dynamic");
item.PrintMe();
list.InsertToBegin(item);
}
//--- удалим элементы списка
list.Destroy();
//--- все элементы списка будут уничтожены,
//--- смотри в терминале закладку Experts
}

Смотри также

Указатели объектов, Проверка указателя объекта, Оператор уничтожения объекта delete


GetTickCount

Справочник MQL4 / Общие функции / GetTickCount

GetTickCount

Функция GetTickCount() возвращает количество миллисекунд, прошедших с момента старта системы.

uint GetTickCount();

Возвращаемое значение

Значение типа uint.

Примечание

Счетчик ограничен разрешающей способностью системного таймера. Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней при непрерывной работе компьютера.

Пример:

#define MAX_SIZE 40
//+------------------------------------------------------------------+
//| скрипт для замера времени вычисления 40 чисел Фибоначчи |
//+------------------------------------------------------------------+
void OnStart()
{
//--- запомним начальное значение
uint start=GetTickCount();
//--- переменная для получения очередного числа из ряда Фибоначчи
long fib=0;
//--- цикл, в котором вычисляем заданное количество чисел из ряда Фибоначчи
for(int i=0;i<MAX_SIZE;i++) fib=TestFibo(i);
//--- получим затраченное время в миллисекундах
uint time=GetTickCount()-start;
//--- выведем в журнал "Эксперты" сообщение
PrintFormat("Вычисление %d первых чисел Фибоначчи заняло %d ms",MAX_SIZE,time);
//--- работа скрипта завершена
return;
}
//+------------------------------------------------------------------+
//| Функция получения числа Фибоначчи по его порядковому номеру |
//+------------------------------------------------------------------+
long TestFibo(long n)
{
//--- первый член ряда Фибоначчи
if(n<2) return(1);
//--- все последующие члены вычисляются по этой формуле
return(TestFibo(n-2)+TestFibo(n-1));
}

Смотри также

Дата и время


GetTickCount

Справочник MQL4 / Общие функции / GetMicrosecondCount

GetMicrosecondCount

Функция GetMicrosecondCount() возвращает количество микросекунд, прошедших с момента начала работы MQL4-программы.

ulong GetMicrosecondCount();

Возвращаемое значение

Значение типа ulong.

Пример:

//+------------------------------------------------------------------+
//| Тестируемый код |
//+------------------------------------------------------------------+
void Test()
{
int res_int=0;
double res_double=0;
//---
for(int i=0;i<10000;i++)
{
res_int+=i*i;
res_int++;
res_double+=i*i;
res_double++;
}
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
uint ui=0,ui_max=0,ui_min=INT_MAX;
ulong ul=0,ul_max=0,ul_min=INT_MAX;
//--- количество тестов
for(int count=0;count<1000;count++)
{
uint ui_res=0;
ulong ul_res=0;
//---
for(int n=0;n<2;n++)
{
//--- выбираем способ измерения
if(n==0) ui=GetTickCount();
else ul=GetMicrosecondCount();
//--- тестируемый код
Test();
//--- копим результат измерения (в зависимости от способа)
if(n==0) ui_res+=GetTickCount()-ui;
else ul_res+=GetMicrosecondCount()-ul;
}
//--- собираем минимальное и максимальное время исполнения кода обоих измерений
if(ui_min>ui_res) ui_min=ui_res;
if(ui_max<ui_res) ui_max=ui_res;
if(ul_min>ul_res) ul_min=ul_res;
if(ul_max<ul_res) ul_max=ul_res;
}
//---
Print("GetTickCount error(msec): ",ui_max-ui_min);
Print("GetMicrosecondCount error(msec): ",DoubleToString((ul_max-ul_min)/1000.0,2));
}

Смотри также

Дата и время


MessageBox

Справочник MQL4 / Общие функции / MessageBox

MessageBox

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

int MessageBox(
string text, // текст сообщения
string caption=NULL, // заголовок окна
int flags=0 // определяет набор кнопок в окне
);

Параметры

text

[in] Текст, содержащий сообщение для отображения.

caption=NULL

[in] Необязательный текст для отображения в заголовке окна сообщения. Если этот параметр пустой, в заголовке окна будет отображено название эксперта.

flags=0

[in] Необязательные флаги, определяющие вид и поведение диалогового окна. Флаги могут быть комбинацией специальной группы флагов .

Возвращаемое значение

Если функция успешно выполняется, возвращаемое значение - одно из значений кодов возврата MessageBox().

Примечание

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

При работе в тестере стратегий функция MessageBox() не выполняется.


PeriodSeconds

Справочник MQL4 / Общие функции / PeriodSeconds

PeriodSeconds

Возвращает количество секунд в периоде.

int PeriodSeconds(
ENUM_TIMEFRAMES period=PERIOD_CURRENT // период графика
);

Параметры

period=PERIOD_CURRENT

[in] Значение периода графика из перечисления ENUM_TIMEFRAMES. Если параметр не указан, то возвращается количество секунд текущего периода графика, на котором запущена программа.

Возвращаемое значение

Количество секунд в указанном периоде.

Смотри также

_Period, Периоды графиков, Дата и время, Видимость объектов


PlaySound

Справочник MQL4 / Общие функции / PlaySound

PlaySound

Воспроизводит звуковой файл.

bool PlaySound(
string filename // имя файла
);

Параметры

filename

[in] Путь к звуковому файлу. Если filename=NULL, воспроизведение звука прекращается.

Возвращаемое значение

true – если звуковой файл найден, иначе возвращает false.

Примечание

Файл должен быть расположен в каталоге каталог_терминала\Sounds или его подкаталоге. Проигрываются только звуковые файлы в формате WAV.

Вызов PlaySound() с параметром NULL останавливает воспроизведение звука.

При работе в тестере стратегий функция PlaySound() не выполняется.

Смотри также

Ресурсы


Print

Справочник MQL4 / Общие функции / Print

Print

Печатает некоторое сообщение в журнал экспертов. Параметры могут иметь любой тип.

void Print(
argument, // первое значение
... // последующие значения
);

Параметры

...

[in] Любые значения, разделенные запятыми. Количество параметров не может превышать 64.

Примечание

Массивы нельзя передавать в функцию Print(). Массивы должны печататься поэлементно.

Данные типа double выводятся с точностью до 16 десятичных цифр после точки, при этом данные могут выводиться либо в традиционном либо в научном формате – в зависимости от того, как запись будет наиболее компактна. Данные типа float выводятся с 5 десятичными цифрами после точки. Для вывода вещественных чисел с другой точностью либо в явно указанном формате необходимо использовать функцию PrintFormat().

Данные типа bool выводятся в виде строк "true" или "false". Даты выводятся в виде YYYY.MM.DD HH:MI:SS. Для вывода даты в другом формате необходимо использовать функцию TimeToString(). Данные типа color выводятся либо в виде строки R,G,B, либо в виде названия цвета, если этот цвет присутствует в наборе цветов.

При работе в тестере стратегий в режиме оптимизации функция Print() не выполняется.

Пример:

void OnStart()
{
//--- выведем DBL_MAX с помощью Print(), это равносильно PrintFormat(%%.16G,DBL_MAX)
Print("---- как выглядит DBL_MAX -----");
Print("Print(DBL_MAX)=",DBL_MAX);
//--- теперь выведем число DBL_MAX с помощью PrintFormat()
PrintFormat("PrintFormat(%%.16G,DBL_MAX)=%.16G",DBL_MAX);
//--- Вывод в журнал "Эксперты"
// Print(DBL_MAX)=1.797693134862316e+308
// PrintFormat(%.16G,DBL_MAX)=1.797693134862316E+308

//--- посмотрим как выводится тип float
float c=(float)M_PI; // нужно явно приводить к целевому типу
Print("c=",c, " Pi=",M_PI, " (float)M_PI=",(float)M_PI);
// c=3.14159 Pi=3.141592653589793 (float)M_PI=3.14159

//--- покажем, что может произойти при арифметических операциях над вещественными типами
double a=7,b=200;
Print("---- перед арифметическими операциями");
Print("a=",a," b=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- разделим a на b (7/200)
a=a/b;
//--- теперь как будто восстановим значение в переменной b
b=7.0/a; // ожидается, что b=7.0/(7.0/200.0)=>7.0/7.0*200.0=200 - но это не так
//--- выведем вновь вычисленное значение b
Print("----- после арифметических операций");
Print("Print(b)=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- вывод в журнал "Эксперты"
// Print(b)=200.0
// Print(DoubleToString(b,16))=199.9999999999999716 (видим, что на самом деле b уже не равно 200.0)

//--- создадим очень маленькое значение epsilon=1E-013
double epsilon=1e-13;
Print("---- создадим очень маленькое число");
Print("epsilon=",epsilon); // получим epsilon=1E-013
//--- теперь вычтем эпсилон из числа b и выведем снова значение в журнал "Эксперты"
b=b-epsilon;
//--- выводим двумя способами
Print("---- после вычитания epsilon из переменной b");
Print("Print(b)=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- вывод в журнал "Эксперты"
// Print(b)=199.9999999999999 (теперь значение b после вычитания эпсилон не может округлиться до 200)
// Print(DoubleToString(b,16))=199.9999999999998578
// (теперь значение b после вычитания эпсилон не может округлиться до 200)
}

Смотри также

Alert(), Comment(), DoubleToString(), StringFormat()


PrintFormat

Справочник MQL4 / Общие функции / PrintFormat

PrintFormat

Форматирует и печатает наборы символов и значений в журнал экспертов в соответствии с заданным форматом.

void PrintFormat(
string format_string, // форматная строка
... // значения простых типов
);

Параметры

format_string

[in] Строка формата состоит из обычных символов и, если за строкой формата следуют аргументы, еще и спецификации формата.

...

[in] Любые значения простых типов, разделенные запятыми. Общее количество параметров не может превышать 64, включая форматную строку.

Возвращаемое значение

Строка.

Примечание

При работе в тестере стратегий в режиме оптимизации функция PrintFormat() не выполняется.

Количество, порядок и тип параметров должны точно соответствовать составу спецификаторов, в противном случае результат печати неопределён. Вместо функции PrintFormat() можно использовать функцию printf().

Если за строкой формата следуют еще параметры, то эта строка должна содержать спецификации формата, определяющие формат вывода этих параметров. Спецификация формата всегда начинается с символа знака процента (%).

Строка формата читается слева направо. Когда встречается первая спецификация формата (если она есть), то значение первого параметра после строки формата преобразовывается и выводится согласно заданной спецификации. Вторая спецификация формата вызывает преобразование и вывод второго параметра и так далее, до конца строки формата.

Спецификация формата имеет следующую форму:

%[flags][width][.precision][{h | l | ll | I32 | I64}]type

Каждое поле форматной спецификации является либо простым символом, либо числом, обозначающим обычную форматную опцию. Простейшая спецификация формата содержит только знак процента (%) и символ, определяющий тип выводимого параметра (например %s). Если требуется в форматной строке вывести символ знак процента, то необходимо использовать форматную спецификацию %%.

flags

Флаг | Описание | Поведение по умолчанию
– (минус) | Выравнивание по левому краю в пределах заданной ширины | Выравнивание по правому краю
+ (плюс) | Вывод знака + или - для значений знаковых типов | Знак выводится только если значение отрицательное
0 (ноль) | Перед выводимом значением добавляются нули в пределах заданной ширины. Если указан флаг 0 с целочисленным форматом (i, u, x, X, o, d) и задана спецификация точности (например, %04.d), то 0 игнорируется. | Ничего не вставляется
пробел | Перед выводимым значением ставится пробел, если значение является знаковым и положительным | Пробелы не вставляются
# | Если используется совместно с форматом o, x или X, то перед выводимым значением добавляется 0, 0x или 0X соответственно. | Ничего не вставляется
 | Если используется совместно с форматом e, E, a или A, то значение всегда выводится с десятичной точкой. | Десятичная точка выводится только если есть ненулевая дробная часть.
 | Если используется совместно с форматом g или G, флаг определяет наличие десятичной точки в выводимом значении и препятствует отсечению ведущих нулей. Флаг # игнорируется при совместном использовании с форматами c, d, i, u, s. | Десятичная точка выводится только если есть ненулевая дробная часть. Ведущие нули отсекаются

width

Неотрицательное десятичное число, которое задает минимальное число выводимых символов отформатированного значения. Если количество выводимых символов меньше указанной ширины, то добавляется соответствующее количество пробелов слева или справа в зависимости от выравнивания (флаг –). При наличии флага ноль (0), перед выводимым значением добавляется соответствующее количество нулей. Если число выводимых символов больше заданной ширины, то выводимое значение никогда не усекается.

Если в качестве ширины указана звездочка (*), то в списке передаваемых параметров на соответствующем месте должно быть значение типа int, которое будет использовано для указания ширины выводимого значения.

precision

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

Для разных форматных типов (type) спецификация точности применяется по-разному.

Типы | Описание | Поведение по умолчанию
a, A | Спецификация точности указывает количество знаков после десятичной точки | Точность по умолчанию – 6.
c, C | Не применяется |
d, i, u, o, x, X | Указывает минимальное число выводимых цифр. Если количество цифр в соответствующем параметре меньше указанной точности, то выводимое значение дополняется слева нулями. Выводимое значение не обрезается, если количество выводимых цифр больше указанной точности | Точность по умолчанию – 1.
e, E, f | Указывает число выводимых цифр после десятичной точки. Последняя выводимая цифра округляется | Точность по умолчанию – 6. Если указана точность 0 или дробная часть отсутствует, то десятичная точка не выводится.
g, G | Указывает максимальное число значимых цифр | Выводится 6 значимых цифр.
s, S | Указывает количество выводимых символов строки. Если длина строки превышает значение точности, то строка усекается на выводе | Выводится вся строка

h | l | ll | I32 | I64

Спецификации размеров данных, передаваемых в качестве параметра.

Тип параметра | Используемый префикс | Совместный спецификатор типа
int | l (маленькая L) | d, i, o, x, or X
uint | l (маленькая L) | o, u, x, or X
long | ll (две маленькие L) | d, i, o, x, or X
short | h | d, i, o, x, or X
ushort | h | o, u, x, or X
int | I32 | d, i, o, x, or X
uint | I32 | o, u, x, or X
long | I64 | d, i, o, x, or X
ulong | I64 | o, u, x, or X

type

Спецификатор типа является единственным обязательным полем для форматированного вывода.

Символ | Тип | Выводной формат
c | int | Символ типа short (Unicode)
C | int | Символ типа char (ANSI)
d | int | Знаковое десятичное целое
i | int | Знаковое десятичное целое
o | int | Беззнаковое восьмеричное целое
u | int | Беззнаковое десятичное целое
x | int | Беззнаковое шестнадцатиричное целое с использованием "abcdef"
X | int | Беззнаковое шестнадцатиричное целое с использованием "ABCDEF"
e | double | Вещественное значение в формате [ – ]d.dddd e [sign]ddd, где d – одна десятичная цифра, dddd – одна или больше десятичных цифр, ddd – трехзначное число, определяющее размер экспоненты, sign – знак плюс или минус
E | double | Идентично формату e, за исключением того, что знак экспоненты вывоится большой буквой (E вместо e)
f | double | Вещественное значение в формате [ – ]dddd.dddd, где dddd – одна или больше десятичных цифр. Количество выводимых знаков перед десятичной точкой зависит от величины значения числа. Количество знаков после десятичной точки зависит от требуемой точности.
g | double | Вещественное значение, выводимое в формате f или e, в зависимости от того какой вывод будет компактнее.
G | double | Вещественное значение, выводимое в формате f или E, в зависимости от того какой вывод будет компактнее.
a | double | Вещественное значение в формате [−]0xh.hhhh p±dd, где h.hhhh – мантисса в виде шестнадцатиричных цифр с использованием "abcdef", dd – одна или более цифр экспоненты. Количество знаков после запятой определяется спецификацией точности
A | double | Вещественное значение в формате [−]0xh.hhhh P±dd, где h.hhhh – мантисса в виде шестнадцатиричных цифр с использованием "ABCDEF", dd – одна или более цифр экспоненты. Количество знаков после запятой определяется спецификацией точности
s | string | Вывод строки

Вместо функции PrintFormat() можно использовать функцию printf().

Пример:

void OnStart()
{
//--- имя торгового сервера
string server=AccountInfoString(ACCOUNT_SERVER);
//--- номер торговго счета
int login=(int)AccountInfoInteger(ACCOUNT_LOGIN);
//--- вывод значения long
long leverage=AccountInfoInteger(ACCOUNT_LEVERAGE);
PrintFormat("%s %d: плечо = 1:%I64d",
server,login,leverage);
//--- валюта депозита
string currency=AccountInfoString(ACCOUNT_CURRENCY);
//--- вывод значения double с 2 цифрами после десятичной точки
double equity=AccountInfoDouble(ACCOUNT_EQUITY);
PrintFormat("%s %d: размер собственных средств на счете = %.2f %s",
server,login,equity,currency);
//--- вывод значения double с обязательным выводом знака +/-
double profit=AccountInfoDouble(ACCOUNT_PROFIT);
PrintFormat("%s %d: текущий результат по открытым ордерам = %+.2f %s",
server,login,profit,currency);
//--- вывод значения double с переменным количеством цифр после десятичной точки
double point_value=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
string format_string=StringFormat("%%s: значение одного пункта = %%.%df",_Digits);
PrintFormat(format_string,_Symbol,point_value);
//--- вывод значения int
int spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
PrintFormat("%s: текущий спред в пунктах = %d ",
_Symbol,spread);
//--- вывод значения double в научном формате с плавающей запятой и точностью 17 значащих цифр
PrintFormat("DBL_MAX = %.17e",DBL_MAX);
//--- вывод значения double в научном формате с плавающей запятой и точностью 17 значащих цифр
PrintFormat("EMPTY_VALUE = %.17e",EMPTY_VALUE);
//--- вывод через PrintFormat() с точностью по умолчанию
PrintFormat("PrintFormat(EMPTY_VALUE) = %e",EMPTY_VALUE);
//--- простой вывод через Print()
Print("Print(EMPTY_VALUE) = ",EMPTY_VALUE);
/* результат выполнения
MetaQuotes-Demo 4236774: плечо = 1:100
MetaQuotes-Demo 4236774: размер собственных средств на счете = 9998.49 USD
MetaQuotes-Demo 4236774: текущий результат по открытым ордерам = -1.51 USD
EURJPY: значение одного пункта = 0.001
EURJPY: текущий спред в пунктах = 15
DBL_MAX = 1.79769313486231570e+308
EMPTY_VALUE = 2.14748364700000000e+009
PrintFormat(EMPTY_VALUE) = 2.147484e+009
Print(EMPTY_VALUE) = 2147483647
*/
}

Смотри также

StringFormat, DoubleToString, Вещественные типы (double, float)


ResetLastError

Справочник MQL4 / Общие функции / ResetLastError

ResetLastError

Устанавливает значение предопределенной переменной _LastError в ноль.

void ResetLastError();

Возвращаемое значение

Нет возвращаемого значения.

Примечание

Функция GetLastError() обнуляет переменную _LastError.


ResourceCreate

Справочник MQL4 / Общие функции / ResourceCreate

ResourceCreate

Создает ресурс изображения на основе набора данных. Существует два варианта функции:
Создание ресурса на основе файла

bool ResourceCreate(
const string resource_name, // имя ресурса
const string path // относительный путь к файлу
);

Динамическое создание ресурса на основе массива пикселей

bool ResourceCreate(
const string resource_name, // имя ресурса
const uint& data[], // набор данных в виде массива
uint img_width, // ширина создаваемой картинки-ресурса
uint img_height, // высота создаваемой картинки-ресурса
uint data_xoffset, // смещение левого верхнего угла создаваемой картинки по горизонтали вправо
uint data_yoffset, // смещение левого верхнего угла создаваемой картинки по вертикали вниз
uint data_width, // общая ширина изображения на основе набора данных
ENUM_COLOR_FORMAT color_format // способ обработки цвета
);

Параметры

resource_name

[in] Имя ресурса.

path

[in] Относительный путь к файлу, содержащему данные для ресурса. Если путь начинается с обратной косой черты "\" (пишется "\\"), то файл ищется относительно папки каталог_данных_терминала\MQL4\. Если обратной косой черты нет, то ресурс ищется относительно расположения EX4-файла, из которого вызывается функция.

data[][]

[in] Одномерный или двумерный массив для создания полного изображения.

img_width

[in] Ширина прямоугольной области изображения в пикселях для помещения в ресурс в виде картинки. Не может быть больше значения data_width.

img_height

[in] Высота прямоугольной области изображения в пикселях для помещения в ресурс в виде картинки.

data_xoffset

[in] Смещение в пикселях прямоугольной области изображения по горизонтали вправо.

data_yoffset

[in] Смещение в пикселях прямоугольной области изображения по вертикали вниз.

data_width

[in] Требуется только для одномерных массивов и означает полную ширину создаваемого изображения из набора данных. Если data_width=0, то подразумевается равным img_width. Для двумерных массивов данный параметр игнорируется и принимается равным второй размерности массива data[].

color_format

[in] Способ обработки цвета из перечисления ENUM_COLOR_FORMAT.

Возвращаемое значение

true – в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Возможные ошибки:

  • 4015 – ERR_RESOURCE_NAME_DUPLICATED (совпадение имен динамического и статического ресурсов),
  • 4016 – ERR_RESOURCE_NOT_FOUND (ресурс не найден),
  • 4017 – ERR_RESOURCE_UNSUPPORTED_TYPE (тип ресурса не поддерживается),
  • 4018 – ERR_RESOURCE_NAME_IS_TOO_LONG (слишком длинное имя ресурса).

Примечание

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

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

Картинки должны быть в формате BMP с глубиной цвета 24 или 32 бита, звуки могут быть только в формате WAV. Размер ресурса не должен превышать 16 Mb.

ENUM_COLOR_FORMAT

Идентификатор | Описание
COLOR_FORMAT_XRGB_NOALPHA | Компонента альфа-канала игнорируется
COLOR_FORMAT_ARGB_RAW | Компоненты цвета не обрабатываются терминалом (должны быть корректно заданы пользователем)
COLOR_FORMAT_ARGB_NORMALIZE | Компоненты цвета обрабатываются терминалом

Смотри также

Ресурсы, ObjectCreate(), ObjectSetString(), OBJPROP_BMPFILE


ResourceFree

Справочник MQL4 / Общие функции / ResourceFree

ResourceFree

Удаляет динамически созданный ресурс (освобождает занятую ресурсом память).

bool ResourceFree(
const string resource_name // имя ресурса
);

Параметры

resource_name

[in] Имя ресурса, должно начинаться с "::".

Возвращаемое значение

true – в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Функция ResourceFree() позволяет разработчику mql4-программы управлять потреблением памяти при активной работе с ресурсами. Графические объекты, привязанные к удаляемому из памяти ресурсу, будут отображаться правильно и после его удаления. Но вновь созданные графические объекты (OBJ_BITMAP и OBJ_BITMAP_LABEL) уже не смогут использовать удалённый ресурс.

Функция удаляет только динамические ресурсы, созданные данной программой.

Смотри также

Ресурсы, ObjectCreate(), PlaySound(), ObjectSetString(), OBJPROP_BMPFILE


ResourceReadImage

Справочник MQL4 / Общие функции / ResourceReadImage

ResourceReadImage

Читает данные графического ресурса, созданного функцией ResourceCreate() или сохраненного в EX4-файле при компиляции.

bool ResourceReadImage(
const string resource_name, // имя графического ресурса для чтения
uint& data[], // массив для получения данных из ресурса
uint& width, // для получения ширины картинки в ресурсе
uint& height // для получения высоты картинки в ресурсе
);

Параметры

resource_name

[in] Имя графического ресурса, содержащего изображение. Для доступа к собственным ресурсам указывается в коротком виде "::resourcename". Если же необходимо загрузить ресурс из скомпилированного EX4-файла, то необходимо имя в полном виде с указанием пути относительно папки MQL4, имени файла и имени ресурса – "path\\filename.ex4::resourcename".

data[][]

[in] Одномерный или двумерный массив для получения данных из графического ресурса.

img_width

[out] Ширина картинки графического ресурса в пикселях.

img_height

[out] Высота картинки графического ресурса в пикселях.

Возвращаемое значение

true – в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Если на основании массива data[] в дальнейшем необходимо создать графический ресурс, то следует использовать формат цвета COLOR_FORMAT_ARGB_NORMALIZE или COLOR_FORMAT_XRGB_NOALPHA.

Если массив data[] является двумерным и его вторая размерность меньше размера X(width) графического ресурса, то функция ResourceReadImage() вернет false и чтение не будет произведено. Но при этом, если ресурс существует, то в параметры width и height возвращаются актуальные размеры картинки. Это позволит сделать еще одну попытку получения данных из ресурса.

Смотри также

Ресурсы, ObjectCreate(), ObjectSetString(), OBJPROP_BMPFILE


ResourceSave

Справочник MQL4 / Общие функции / ResourceSave

ResourceSave

Сохраняет ресурс в указанный файл.

bool ResourceSave(
const string resource_name, // имя ресурса
const string file_name // имя файла
);

Параметры

resource_name

[in] Имя ресурса, должно начинаться с "::".

file_name

[in] Имя файла относительно MQL4\Files.

Возвращаемое значение

true – в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Функция всегда перезаписывает файл и создаёт при необходимости все промежуточные подкаталоги в имени файла в случае их отсутствия.

Смотри также

Ресурсы, ObjectCreate(), PlaySound(), ObjectSetString(), OBJPROP_BMPFILE


SetUserError

Справочник MQL4 / Общие функции / SetUserError

SetUserError

Устанавливает предопределенную переменную _LastError в значение, равное ERR_USER_ERROR_FIRST + user_error.

void SetUserError(
ushort user_error // номер ошибки
);

Параметры

user_error

[in] Номер ошибки, устанавливаемый пользователем.

Возвращаемое значение

Нет возвращаемого значения.

Примечание

После того, как была выставлена ошибка при помощи функции SetUserError(user_error), функция GetLastError() вернет значение, равное ERR_USER_ERROR_FIRST + user_error.

Пример:

void OnStart()
{
//--- установим номер ошибки 65537=(ERR_USER_ERROR_FIRST +1)
SetUserError(1);
//--- получим код последней ошибки
Print("GetLastError = ",GetLastError());
//--- Результат
//--- GetLastError = 65537
}


SendFTP

Справочник MQL4 / Общие функции / SendFTP

SendFTP

Посылает файл по адресу, указанному в окне настроек на закладке "FTP".

bool SendFTP(
string filename, // файл для отсылки по ftp
string ftp_path=NULL // путь для выгрузки на ftp-сервере
);

Параметры

filename

[in] Имя отсылаемого файла.

ftp_path=NULL

[in] Каталог FTP. Если каталог не указан, то используется каталог, описанный в настройках.

Возвращаемое значение

В случае неудачи возвращает false.

Примечание

Отсылаемый файл должен находиться в папке каталог_терминала\MQL4\Files или ее подпапках. Отсылка не производится, если в настройках не указан адрес FTP и/или пароль доступа.

При работе в тестере стратегий функция SendFTP() не выполняется.

Что нового в MQL5

В языке MQL5 функции SendFTP, SendMail, SendNotification перенесены в новый расширенный раздел Сетевые функции. Теперь программы могут обмениваться данными с удаленными серверами, которые включены в список разрешенных IP-адресов. Это означает, что советники на MQL5 могут устанавливать защищенные соединения между процессами с помощью протокола TCP/IP без использования сторонних DLL.


SendMail

Справочник MQL4 / Общие функции / SendMail

SendMail

Посылает электронное письмо по адресу, указанному в окне настроек на закладке "Почта".

bool SendMail(
string subject, // заголовок
string some_text // текст письма
);

Параметры

subject

[in] Заголовок письма.

some_text

[in] Тело письма.

Возвращаемое значение

true – если письмо поставлено в очередь на отсылку, иначе возвращает false.

Примечание

Отсылка может быть запрещена в настройках, также может быть не указан адрес электронной почты. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

При работе в тестере стратегий функция SendMail() не выполняется.

Что нового в MQL5

В языке MQL5 функции SendFTP, SendMail, SendNotification перенесены в новый расширенный раздел Сетевые функции. Теперь программы могут обмениваться данными с удаленными серверами, которые включены в список разрешенных IP-адресов. Это означает, что советники на MQL5 могут устанавливать защищенные соединения между процессами с помощью протокола TCP/IP без использования сторонних DLL.


SendNotification

Справочник MQL4 / Общие функции / SendNotification

SendNotification

Посылает уведомление на мобильные терминалы, чьи MetaQuotes ID указаны в окне настроек на закладке "Уведомления".

bool SendNotification(
string text // текст сообщения
);

Параметры

text

[in] Текст сообщения в уведомлении. Длина сообщения должна быть не более 255 символов.

Возвращаемое значение

true при успешной отправке уведомления из терминала, в случае неудачи возвращает false. При проверке после неудачной отправки уведомления GetLastError() может выдать одну из следующих ошибок:

  • 4250 – ERR_NOTIFICATION_SEND_FAILED,
  • 4251 – ERR_NOTIFICATION_WRONG_PARAMETER,
  • 4252 – ERR_NOTIFICATION_WRONG_SETTINGS,
  • 4253 – ERR_NOTIFICATION_TOO_FREQUENT.

Примечание

Для функции SendNotification() установлены жесткие ограничения по использованию: не более 2-х вызовов в секунду и не более 10 вызовов в минуту. Контроль за частотой использования осуществляется динамически, и функция может быть заблокирована при нарушении.

При работе в тестере стратегий функция SendNotification() не выполняется.

Что нового в MQL5

В языке MQL5 функции SendFTP, SendMail, SendNotification перенесены в новый расширенный раздел Сетевые функции. Теперь программы могут обмениваться данными с удаленными серверами, которые включены в список разрешенных IP-адресов. Это означает, что советники на MQL5 могут устанавливать защищенные соединения между процессами с помощью протокола TCP/IP без использования сторонних DLL.


Sleep

Справочник MQL4 / Общие функции / Sleep

Sleep

Функция задерживает выполнение текущего эксперта или скрипта на определенный интервал.

void Sleep(
int milliseconds // интервал
);

Параметры

milliseconds

[in] Интервал задержки в миллисекундах.

Возвращаемое значение

Нет возвращаемого значения.

Примечание

Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить. В функцию встроена проверка состояния флага остановки эксперта каждую 0.1 секунды. Функция Sleep() в тестере стратегий не вызывает никаких задержек.


TerminalClose

Справочник MQL4 / Общие функции / TerminalClose

TerminalClose

Посылает терминалу команду на завершение работы.

bool TerminalClose(
int ret_code // код завершения клиентского терминала
);

Параметры

ret_code

[in] Код возврата, возвращаемый процессом клиентского терминала при завершении работы.

Возвращаемое значение

Возвращает true в случае успеха, иначе false.

Примечание

Функция TerminalClose() не производит немедленной остановки работы терминала, она просто посылает терминалу команду на завершение.

В коде советника, вызвавшего TerminalClose(), должны быть сделаны все приготовления для немедленного завершения работы (например, должны быть штатным образом закрыты все ранее открытые файлы). Сразу после вызова этой функции должен идти оператор return.

Параметр ret_code позволяет указывать нужный код возврата для анализа причин программного прекращения работы терминала при его запуске из командной строки.

Пример:

//--- input parameters
input int tiks_before=500; // количество тиков до завершения
input int pips_to_go=15; // расстояние в пипсах
input int seconds_st=50; // сколько секунд даем эксперту
//--- globals
datetime launch_time;
int tick_counter=0;
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Print(__FUNCTION__," reason code = ",reason);
Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
static double first_bid=0.0;
MqlTick tick;
double distance;
//---
SymbolInfoTick(_Symbol,tick);
tick_counter++;
if(first_bid==0.0)
{
launch_time=tick.time;
first_bid=tick.bid;
Print("first_bid =",first_bid);
return;
}
//--- ход цены в пунктах
distance=(tick.bid-first_bid)/_Point;
//--- выведем сообщение, чтобы отслеживать работу советника
string comm="С момента запуска:\r\n\x25CF прошло секунд: "+
IntegerToString(tick.time-launch_time)+" ;"+
"\r\n\x25CF поступило тиков: "+(string)tick_counter+" ;"+
"\r\n\x25CF цена прошла в пунктах: "+StringFormat("%G",distance);
Comment(comm);
//--- секция проверки условий для закрытия терминала
if(tick_counter>=tiks_before)
TerminalClose(0); // выход по счетчику тиков
if(distance>pips_to_go)
TerminalClose(1); // прошли вверх на pips_to_go пипсов
if(distance<-pips_to_go)
TerminalClose(-1); // прошли вниз на pips_to_go пипсов
if(tick.time-launch_time>seconds_st)
TerminalClose(100); // завершение работы по таймауту
//---
}

Смотри также

Выполнение программ, Ошибки выполнения, Причины деинициализации


TesterStatistics

Справочник MQL4 / Общие функции / TesterStatistics

TesterStatistics

Возвращает значение указанного статистического показателя, рассчитанного по результатам тестирования

double TesterStatistics(
ENUM_STATISTICS statistic_id // идентификатор
);

Параметры

statistic_id

[in] Идентификатор статистического показателя из перечисления ENUM_STATISTICS.

Возвращаемое значение

Значение статистического показателя из результатов тестирования.

Примечание

Функция может быть вызвана внутри OnTester() или OnDeinit() в тестере. В других случаях результат неопределён.


TranslateKey

Справочник MQL4 / Общие функции / TranslateKey

TranslateKey

Возвращает Unicode-символ по виртуальному коду клавиши, учитывая текущий язык ввода и состояние управляющих клавиш.

short TranslateKey(
int key_code // код клавиши для получения Unicode-символа
);

Параметры

key_code

[in] Код клавиши.

Возвращаемое значение

Юникодный символ в случае успешного преобразования. В случае ошибки функция вернёт -1.

Примечание

Функция использует ToUnicodeEx для преобразования нажатых пользователем клавиш в Unicode-символы. Ошибка может возникнуть в том случае, если не сработает ToUnicodeEx – например, при попытке получить символ для клавиши SHIFT.

Пример:

void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
{
if(id==CHARTEVENT_KEYDOWN)
{
short sym=TranslateKey((int)lparam);
//--- если введённый символ успешно преобразован в Юникод
if(sym>0)
Print(sym,"'",ShortToString(sym),"'");
else
Print("Error in TranslateKey for key=",lparam);
}
}

Смотри также

События клиентского терминала, OnChartEvent


WebRequest

Справочник MQL4 / Общие функции / WebRequest

WebRequest

Отправляет HTTP-запрос на указанный сервер. Существует два варианта функции:

1. Для отправки простых запросов вида "ключ=значение" с использованием заголовка Content-Type: application/x-www-form-urlencoded.

int WebRequest(
const string method, // метод HTTP
const string url, // url-адрес
const string cookie, // cookie
const string referer, // referer
int timeout, // таймаут
const char &data[], // массив тела HTTP-сообщения
int data_size, // размер массива data[] в байтах
char &result[], // массив с данными ответа сервера
string &result_headers // заголовки ответа сервера
);

2. Для отправки запросов произвольного типа с указанием собственного набора заголовков для более гибкого взаимодействия с различными Web-сервисами.

int WebRequest(
const string method, // метод HTTP
const string url, // url-адрес
const string headers, // заголовки
int timeout, // таймаут
const char &data[], // массив тела HTTP-сообщения
char &result[], // массив с данными ответа сервера
string &result_headers // заголовки ответа сервера
);

Параметры

method

[in] Метод HTTP.

url

[in] URL-адрес.

headers

[in] Заголовки запроса вида "ключ: значение", разделенные переносом строки "\r\n".

cookie

[in] Значение Cookie.

referer

[in] Значение заголовка Referer HTTP-запроса.

timeout

[in] Таймаут в миллисекундах.

data[]

[in] Массив данных тела HTTP-сообщения.

data_size

[in] Размер массива data[].

result[]

[out] Массив с данными ответа сервера.

result_headers

[out] Заголовки ответа сервера.

Возвращаемое значение

Код ответа HTTP-сервера либо -1 в случае ошибки.

Примечание

Для использования функции WebRequest() следует добавить адреса серверов в список разрешенных URL во вкладке "Советники" окна "Настройки". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://".

Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение программы и ждет ответа от запрашиваемого сервера. Так как задержки при получении ответа на отправленный запрос могут быть большими, то функция запрещена для вызовов из индикаторов, поскольку индикаторы работают в едином потоке, общем для всех индикаторов и графиков на данном символе. Задержка выполнения индикатора на одном из графиков символа может привести к остановке обновления всех графиков по данному символу.

Функцию можно вызывать только из экспертов и скриптов, так как они работают в собственном потоке выполнения. При вызове из индикатора GetLastError() вернет ошибку 4060 – "Функция не разрешена".

При работе в тестере стратегий функция WebRequest() не выполняется.

Пример использования 1-го варианта функции WebRequest():

void OnStart()
{
string cookie=NULL,headers;
char post[],result[];
int res;
//--- для работы с сервером необходимо добавить URL "https://www.google.com/finance"
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
string google_url="https://www.google.com/finance";
//--- обнуляем код последней ошибки
ResetLastError();
//--- загрузка html-страницы с Google Finance
int timeout=5000; //--- timeout менее 1000 (1 сек.) недостаточен при низкой скорости Интернета
res=WebRequest("GET",google_url,cookie,NULL,timeout,post,0,result,headers);
//--- проверка ошибок
if(res==-1)
{
Print("Ошибка в WebRequest. Код ошибки =",GetLastError());
//--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления
MessageBox("Необходимо добавить адрес '"+google_url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
}
else
{
//--- успешная загрузка
PrintFormat("Файл успешно загружен, Размер файла =%d байт.",ArraySize(result));
//--- сохраняем данные в файл
int filehandle=FileOpen("GoogleFinance.htm",FILE_WRITE|FILE_BIN);
//--- проверка ошибки
if(filehandle!=INVALID_HANDLE)
{
//--- сохраняем содержимое массива result[] в файл
FileWriteArray(filehandle,result,0,ArraySize(result));
//--- закрываем файл
FileClose(filehandle);
}
else Print("Ошибка в FileOpen. Код ошибки =",GetLastError());
}
}

Пример использования 2-го варианта функции WebRequest():

#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property script_show_inputs
#property description "Пример скрипта, который публикует сообщение "
#property description "пользователя в ленте на mql5.com"

input string InpLogin =""; //Ваш аккаунт в MQL5.com
input string InpPassword=""; //Пароль для вашего аккаунта
input string InpFileName="EURUSDM5.png"; //Картинка в папке MQL5/Files/
input string InpFileType="image/png"; //Правильный mime type картинки
//+------------------------------------------------------------------+
//| Публикация сообщения с картинкой в ленте mql5.com |
//+------------------------------------------------------------------+
bool PostToNewsFeed(string login,string password,string text,string filename,string filetype)
{
int res; // для помещения результата выполнения операций
char data[]; // массив с данными для отправки POST-запросов
char file[]; // сюда прочитаем картинку
string str="Login="+login+"&Password="+password;
string auth,sep="-------Jyecslin9mp8RdKV"; // разделитель данных формата multipart
//--- имеется файл - пробуем прочитать его
if(filename!=NULL && filename!="")
{
res=FileOpen(filename,FILE_READ|FILE_BIN);
if(res<0)
{
Print("Ошибка открытия файла \""+filename+"\"");
return(false);
}
//--- читаем данные файла
if(FileReadArray(res,file)!=FileSize(res))
{
FileClose(res);
Print("Ошибка чтения файла \""+filename+"\"");
return(false);
}
//---
FileClose(res);
}
//--- сформируем тело POST запроса на авторизацию
ArrayResize(data,StringToCharArray(str,data,0,WHOLE_ARRAY,CP_UTF8)-1);
//--- сбросим код ошибки
ResetLastError();
//--- выполняем запрос на авторизацию
res=WebRequest("POST","https://www.mql5.com/ru/auth_login",NULL,0,data,data,str);
//--- если авторизация не удалась
if(res!=200)
{
Print("Ошибка авторизации #"+(string)res+", LastError="+(string)GetLastError());
return(false);
}
//--- вычитаем из заголовка ответа сервера cookie авторизации
res=StringFind(str,"Set-Cookie: auth=");
//--- если cookie не найден, сообщим об ошибке
if(res<0)
{
Print("Ошибка, данные авторизации не найдены в ответе сервера (проверте логин/пароль)");
return(false);
}
//--- запомним авторизационные данные и сформируем заголовок для последующих запросов
auth=StringSubstr(str,res+12);
auth="Cookie: "+StringSubstr(auth,0,StringFind(auth,";")+1)+"\r\n";
//--- если имеется файл данных, отправляем его на сервер
if(ArraySize(file)!=0)
{
//--- сформируем тело запроса
str="--"+sep+"\r\n";
str+="Content-Disposition: form-data; name=\"attachedFile_imagesLoader\"; filename=\""+filename+"\"\r\n";
str+="Content-Type: "+filetype+"\r\n\r\n";
res =StringToCharArray(str,data);
res+=ArrayCopy(data,file,res-1,0);
res+=StringToCharArray("\r\n--"+sep+"--\r\n",data,res-1);
ArrayResize(data,ArraySize(data)-1);
//--- сформируем заголовок запроса
str=auth+"Content-Type: multipart/form-data; boundary="+sep+"\r\n";
//--- сбросим код ошибки
ResetLastError();
//--- выполняем запрос на передачу файла изображения на сервер
res=WebRequest("POST","https://www.mql5.com/upload_file",str,0,data,data,str);
//--- проверим результат запроса
if(res!=200)
{
Print("Ошибка передачи файла на сервер #"+(string)res+", LastError="+(string)GetLastError());
return(false);
}
//--- получим ссылку на картинку, которую загрузили на сервер
str=CharArrayToString(data);
if(StringFind(str,"{\"Url\":\"")==0)
{
res =StringFind(str,"\"",8);
filename=StringSubstr(str,8,res-8);
//--- при ошибке закачки файла, вернётся пустая ссылка
if(filename=="")
{
Print("Передача файла на сервер не удалась");
return(false);
}
}
}
//--- сформируем тело запроса публикации сообщения на сервере
str ="--"+sep+"\r\n";
str+="Content-Disposition: form-data; name=\"content\"\r\n\r\n";
str+=text+"\r\n";
//--- на каких языках сайта mql5.com будет доступна публикация
str+="--"+sep+"\r\n";
str+="Content-Disposition: form-data; name=\"AllLanguages\"\r\n\r\n";
str+="on\r\n";
//--- если картинка была загружена на сервер - передадим ссылку на неё
if(ArraySize(file)!=0)
{
str+="--"+sep+"\r\n";
str+="Content-Disposition: form-data; name=\"attachedImage_0\"\r\n\r\n";
str+=filename+"\r\n";
}
//--- завершающая строка multipart-запроса
str+="--"+sep+"--\r\n";
//--- собираем тело POST-запроса в одну строку
StringToCharArray(str,data,0,WHOLE_ARRAY,CP_UTF8);
ArrayResize(data,ArraySize(data)-1);
//--- подготовим заголовок запроса
str=auth+"Content-Type: multipart/form-data; boundary="+sep+"\r\n";
//--- выполняем запрос на публикацию сообщение в ленте пользователя mql5.com
res=WebRequest("POST","https://www.mql5.com/ru/users/"+login+"/wall",str,0,data,data,str);
//--- в случае успешной публикации вернем true
return(res==200);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- опубликуем пост на mql5.com c картинкой, путь к которой возьмем из параметра InpFileName
PostToNewsFeed(InpLogin,InpPassword,"Проверка расширенной версии функции WebRequest\r\n"
"(Данное сообщение размещено скриптом WebRequest.mq5)",InpFileName,InpFileType);
}
//+------------------------------------------------------------------+


ZeroMemory

Справочник MQL4 / Общие функции / ZeroMemory

ZeroMemory

Функция обнуляет переменную, переданную ей по ссылке.

void ZeroMemory(
void & variable // обнуляемая переменная
);

Параметры

variable

[in] [out] Переменная, передаваемая по ссылке, которую требуется обнулить (инициализировать нулевыми значениями).

Возвращаемое значение

Нет возвращаемого значения.

Примечание

Если параметром функции является строка, то данный вызов будет эквивалентен указанию для нее значения NULL.
Для простых типов и их массивов, а также структур/классов, состоящих из таких типов, это простое обнуление.
Для объектов, содержащих строки и динамические массивы, производится вызов ZeroMemory() для каждого члена.
Для любых массивов, не защищенных модификатором const, производится обнуление всех элементов.
Для массивов сложных объектов происходит вызов ZeroMemory() для каждого элемента.

Функция ZeroMemory() не применима для классов с защищенными членами или наследованием.


Операции с массивами

Справочник MQL4 / Операции с массивами

Группа функций для работы с массивами

Допускаются не более чем четырехмерные массивы. Индексация каждого измерения производится от 0 до размер_измерения-1. В частном случае одномерного массива из 50 элементов обращение к первому элементу будет выглядеть как array[0], к последнему элементу - array[49].

Функция | Действие
ArrayBsearch | Возвращает индекс первого найденного элемента в первом измерении массива
ArrayCopy | Копирует один массив в другой
ArrayCompare | Возвращает результат сравнения двух массивов простых типов или пользовательских структур, не имеющих сложных объектов
ArrayFree | Освобождает буфер любого динамического массива и устанавливает размер нулевого измерения в 0 (ноль)
ArrayGetAsSeries | Проверяет направление индексации массива
ArrayInitialize | Устанавливает все элементы числового массива в одну величину
ArrayFill | Заполняет числовой массив указанным значением
ArrayIsSeries | Проверяет, является ли массив таймсерией
ArrayIsDynamic | Проверяет, является ли массив динамическим
ArrayMaximum | Поиск элемента с максимальным значением
ArrayMinimum | Поиск элемента с минимальным значением
ArrayRange | Возвращает число элементов в указанном измерении массива
ArrayResize | Устанавливает новый размер в первом измерении массива
ArraySetAsSeries | Устанавливает направление индексирования в массиве
ArraySize | Возвращает количество элементов в массиве
ArraySort | Сортировка числовых массивов по первому измерению
ArrayCopyRates | Копирует в двумерный массив вида RateInfo[][6], данные баров текущего графика и возвращает количество скопированных баров
ArrayCopySeries | Копирует массив-таймсерию в пользовательский массив и возвращает количество скопированных элементов
ArrayDimension | Возвращает ранг многомерного массива

Что нового в MQL5

Добавлены функции для быстрой вставки, удаления, копирования, разворачивания элементов массива. Новая функция ArraySwap() обменивает между собой содержимое двух динамических массивов одного типа, а функция ArrayPrint() позволит легко распечатать в журнал массив простого типа или простой структуры.

Для быстрой и простой визуализации данных можно использовать Графическую библиотеку, которая содержит функции быстрой отрисовки 5-ти типов графика с автоматическим масштабированием, выбором цвета и сглаживанием линий.


ArrayBsearch

Справочник MQL4 / Операции с массивами / ArrayBsearch

ArrayBsearch

Ищет указанное значение в отсортированном по возрастанию многомерном числовом массиве. Поиск производится в первом измерении с учетом флага AS_SERIES.

Для поиска в массиве типа double

int ArrayBsearch(
const double& array[], // массив для поиска
double value, // значение для поиска
int count=WHOLE_ARRAY, // количество элементов
int start=0, // начальный индекс
int direction=MODE_ASCEND // направление поиска
);

Для поиска в массиве типа float

int ArrayBsearch(
const float& array[], // массив для поиска
float value, // значение для поиска
int count=WHOLE_ARRAY, // количество элементов
int start=0, // начальный индекс
int direction=MODE_ASCEND // направление поиска
);

Для поиска в массиве типа long

int ArrayBsearch(
const long& array[], // массив для поиска
long value, // значение для поиска
int count=WHOLE_ARRAY, // количество элементов
int start=0, // начальный индекс
int direction=MODE_ASCEND // направление поиска
);

Для поиска в массиве типа int

int ArrayBsearch(
const int& array[], // массив для поиска
int value, // значение для поиска
int count=WHOLE_ARRAY, // количество элементов
int start=0, // начальный индекс
int direction=MODE_ASCEND // направление поиска
);

Для поиска в массиве типа short

int ArrayBsearch(
const short& array[], // массив для поиска
short value, // значение для поиска
int count=WHOLE_ARRAY, // количество элементов
int start=0, // начальный индекс
int direction=MODE_ASCEND // направление поиска
);

Для поиска в массиве типа char

int ArrayBsearch(
const char& array[], // массив для поиска
char value, // значение для поиска
int count=WHOLE_ARRAY, // количество элементов
int start=0, // начальный индекс
int direction=MODE_ASCEND // направление поиска
);

Параметры

array[]

[in] Числовой массив для поиска.

value

[in] Значение для поиска.

count=WHOLE_ARRAY

[in] Количество элементов для поиска. По умолчанию поиск производится во всем массиве.

start=0

[in] Начальный индекс для поиска. По умолчанию поиск начинается с первого элемента.

direction=MODE_ASCEND

[in] Направление поиска. Возможные значения:

MODE_ASCEND - поиск в направлении возрастания,
MODE_DESCEND - поиск в направлении убывания.

Возвращаемое значение

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

Примечание

Двоичный поиск обрабатывает только сортированные массивы. Для сортировки числового массива используется функция ArraySort().

Пример:

datetime daytimes[];
int shift=10,dayshift;
// Все Time[] серии времени отсортировано в направлении убывания
ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);
if(Time[shift]>=daytimes[0]) dayshift=0;
else
{
dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND);
if(Period()<PERIOD_D1) dayshift++;
}
Print(TimeToStr(Time[shift])," corresponds to ",dayshift," day bar opened at ",
TimeToStr(daytimes[dayshift]));


ArrayCopy

Справочник MQL4 / Операции с массивами / ArrayCopy

ArrayCopy

Производит копирование одного массива в другой.

int ArrayCopy(
void& dst_array[], // куда копируем
const void& src_array[], // откуда копируем
int dst_start=0, // с какого индекса пишем в приемник
int src_start=0, // с какого индекса копируем из источника
int count=WHOLE_ARRAY // сколько элементов
);

Параметры

dst_array[]

[out] Массив-приемник.

src_array[]

[in] Массив-источник.

dst_start=0

[in] Начальный индекс для приемного массива. По умолчанию, стартовый индекс - 0.

src_start=0

[in] Начальный индекс для исходного массива. По умолчанию, стартовый индекс - 0.

count=WHOLE_ARRAY

[in] Количество элементов, которые нужно скопировать. По умолчанию копируется весь массив (count=WHOLE_ARRAY).

Возвращаемое значение

Возвращает количество скопированных элементов.

Примечание

Если count<=0 либо count>src_size-src_start, то копируется весь остаток массива. Массивы копируются слева направо. Для серийных массивов правильно переопределяется стартовая позиция с учетом копирования слева направо. Если копируется массив сам в себя, то результат неопределен.

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

Для динамических и статических (кроме членов классов и структур) массивов производится автоматическое увеличение размера массива-приемника до количества копируемых данных (в случае, если количество копируемых данных превышает его размер).

Пример:

void OnStart()
{
//---
int src_data[10];
for (int i=0; i<ArraySize(src_data); i++) src_data[i]=i;
int dst_data[];
//--- копируем данные из массива src_data[] в массив dst_data[]
ArrayCopy(dst_data,src_data,0,0,WHOLE_ARRAY);
//--- вывод скопированных данных
PrintFormat("Copied array size=%d",ArraySize(dst_data));
for (int i=0; i<ArraySize(dst_data); i++) PrintFormat("index=%d, value=%d",i,dst_data[i]);
}


ArrayCompare

Справочник MQL4 / Операции с массивами / ArrayCompare

ArrayCompare

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

int ArrayCompare(
const void& array1[], // первый массив
const void& array2[], // второй массив
int start1=0, // начальное смещение в первом массиве
int start2=0, // начальное смещение во втором массиве
int count=WHOLE_ARRAY // количество элементов для сравнения
);

Параметры

array1[]

[in] Первый массив.

array2[]

[in] Второй массив.

start1=0

[in] Начальный индекс элемента в первом массиве, с которого начнется сравнение. По умолчанию стартовый индекс - 0.

start2=0

[in] Начальный индекс элемента во втором массиве, с которого начнется сравнение. По умолчанию стартовый индекс - 0.

count=WHOLE_ARRAY

[in] Количество элементов, которые нужно сравнить. По умолчанию в сравнении участвуют все элементы обоих массивов (count=WHOLE_ARRAY).

Возвращаемое значение

  • -1, если array1[] меньше array2[]
  • 0, если array1[] и array2[] равны
  • 1, если array1[] больше array2[]
  • -2, при возникновении ошибки из-за несовместимости типов сравниваемых массивов, или при значениях start1, start2 или count, приводящих к выходу за пределы массива.

Примечание

При разных размерах сравниваемых массивов и с указанным значением count=WHOLE_ARRAY для случая, когда один массив является точным подмножеством другого, функция не вернёт 0 (массивы не будут считаться равными). В этом случае будет возвращен результат сравнения размеров этих массивов: -1, если размер array1[] меньше размера array2[] или 1 в противном случае.


ArrayFree

Справочник MQL4 / Операции с массивами / ArrayFree

ArrayFree

Освобождает буфер любого динамического массива и устанавливает размер нулевого измерения в 0.

void ArrayFree(
void& array[] // массив
);

Параметры

array[]

[in] Динамический массив.

Возвращаемое значение

Нет возвращаемого значения.

Примечание

При написании скриптов и индикаторов необходимость в использовании функции ArrayFree() может возникнуть не часто: так как при завершении работы скрипта вся использованная память сразу же освобождается, а в пользовательских индикаторах основная работа с массивами представляет собою доступ к индикаторным буферам, размеры которых автоматически управляются исполняющей подсистемой терминала.

Если в программе необходимо самостоятельно управлять памятью в сложных динамических условиях, то функция ArrayFree() позволит явным образом и немедленно освобождать память, занятую ненужным уже динамическим массивом.

Пример:

#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Label.mqh>
#include <Controls\ComboBox.mqh>
//--- предопределенные константы
#define X_START 0
#define Y_START 0
#define X_SIZE 280
#define Y_SIZE 300
//+------------------------------------------------------------------+
//| Класс диалога для работы с памятью |
//+------------------------------------------------------------------+
class CMemoryControl : public CAppDialog
{
private:
//--- размер массива
int m_arr_size;
//--- массивы
char m_arr_char[];
int m_arr_int[];
float m_arr_float[];
double m_arr_double[];
long m_arr_long[];
//--- надписи
CLabel m_lbl_memory_physical;
CLabel m_lbl_memory_total;
CLabel m_lbl_memory_available;
CLabel m_lbl_memory_used;
CLabel m_lbl_array_size;
CLabel m_lbl_array_type;
CLabel m_lbl_error;
CLabel m_lbl_change_type;
CLabel m_lbl_add_size;
//--- кнопки
CButton m_button_add;
CButton m_button_free;
//--- списки
CComboBox m_combo_box_step;
CComboBox m_combo_box_type;
//--- текущее значение типа массива из списка
int m_combo_box_type_value;

public:
CMemoryControl(void);
~CMemoryControl(void);
//--- метод создания объекта класса
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
//--- обработчик событий графика
virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

protected:
//--- создание надписи
bool CreateLabel(CLabel &lbl,const string name,const int x,const int y,const string str,const int font_size,const int clr);
//--- создание элементов управления
bool CreateButton(CButton &button,const string name,const int x,const int y,const string str,const int font_size,const int clr);
bool CreateComboBoxStep(void);
bool CreateComboBoxType(void);
//--- обработчики событий
void OnClickButtonAdd(void);
void OnClickButtonFree(void);
void OnChangeComboBoxType(void);
//--- методы работы с текущим массивом
void CurrentArrayFree(void);
bool CurrentArrayAdd(void);
};
//+------------------------------------------------------------------+
//| Освобождение памяти текущего массива |
//+------------------------------------------------------------------+
void CMemoryControl::CurrentArrayFree(void)
{
//--- сброс размера массива
m_arr_size=0;
//--- освобождение массива
if(m_combo_box_type_value==0)
ArrayFree(m_arr_char);
if(m_combo_box_type_value==1)
ArrayFree(m_arr_int);
if(m_combo_box_type_value==2)
ArrayFree(m_arr_float);
if(m_combo_box_type_value==3)
ArrayFree(m_arr_double);
if(m_combo_box_type_value==4)
ArrayFree(m_arr_long);
}
//+------------------------------------------------------------------+
//| Попытка добавления памяти для текущего массива |
//+------------------------------------------------------------------+
bool CMemoryControl::CurrentArrayAdd(void)
{
//--- если размер используемой памяти больще чем размер физической памяти, то выходим
if(TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)/TerminalInfoInteger(TERMINAL_MEMORY_USED)<2)
return(false);
//--- попытка выделения памяти в зависимости от текущего типа
if(m_combo_box_type_value==0 && ArrayResize(m_arr_char,m_arr_size)==-1)
return(false);
if(m_combo_box_type_value==1 && ArrayResize(m_arr_int,m_arr_size)==-1)
return(false);
if(m_combo_box_type_value==2 && ArrayResize(m_arr_float,m_arr_size)==-1)
return(false);
if(m_combo_box_type_value==3 && ArrayResize(m_arr_double,m_arr_size)==-1)
return(false);
if(m_combo_box_type_value==4 && ArrayResize(m_arr_long,m_arr_size)==-1)
return(false);
//--- память выделена
return(true);
}
//+------------------------------------------------------------------+
//| Обработка событий |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CMemoryControl)
ON_EVENT(ON_CLICK,m_button_add,OnClickButtonAdd)
ON_EVENT(ON_CLICK,m_button_free,OnClickButtonFree)
ON_EVENT(ON_CHANGE,m_combo_box_type,OnChangeComboBoxType)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Конструктор |
//+------------------------------------------------------------------+
CMemoryControl::CMemoryControl(void)
{
}
//+------------------------------------------------------------------+
//| Деструктор |
//+------------------------------------------------------------------+
CMemoryControl::~CMemoryControl(void)
{
}
//+------------------------------------------------------------------+
//| Метод создания объекта класса |
//+------------------------------------------------------------------+
bool CMemoryControl::Create(const long chart,const string name,const int subwin,
const int x1,const int y1,const int x2,const int y2)
{
//--- создание объекта базового класса
if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
return(false);
//--- подготовка строк для надписей
string str_physical="Memory physical = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)+" Mb";
string str_total="Memory total = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_TOTAL)+" Mb";
string str_available="Memory available = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb";
string str_used="Memory used = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb";
//--- создание надписей
if(!CreateLabel(m_lbl_memory_physical,"physical_label",X_START+10,Y_START+5,str_physical,12,clrBlack))
return(false);
if(!CreateLabel(m_lbl_memory_total,"total_label",X_START+10,Y_START+30,str_total,12,clrBlack))
return(false);
if(!CreateLabel(m_lbl_memory_available,"available_label",X_START+10,Y_START+55,str_available,12,clrBlack))
return(false);
if(!CreateLabel(m_lbl_memory_used,"used_label",X_START+10,Y_START+80,str_used,12,clrBlack))
return(false);
if(!CreateLabel(m_lbl_array_type,"type_label",X_START+10,Y_START+105,"Array type = double",12,clrBlack))
return(false);
if(!CreateLabel(m_lbl_array_size,"size_label",X_START+10,Y_START+130,"Array size = 0",12,clrBlack))
return(false);
if(!CreateLabel(m_lbl_error,"error_label",X_START+10,Y_START+155,"",12,clrRed))
return(false);
if(!CreateLabel(m_lbl_change_type,"change_type_label",X_START+10,Y_START+185,"Change type",10,clrBlack))
return(false);
if(!CreateLabel(m_lbl_add_size,"add_size_label",X_START+10,Y_START+210,"Add to array",10,clrBlack))
return(false);
//--- создание элементов управления
if(!CreateButton(m_button_add,"add_button",X_START+15,Y_START+245,"Add",12,clrBlue))
return(false);
if(!CreateButton(m_button_free,"free_button",X_START+75,Y_START+245,"Free",12,clrBlue))
return(false);
if(!CreateComboBoxType())
return(false);
if(!CreateComboBoxStep())
return(false);
//--- инициализация переменной
m_arr_size=0;
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Создание кнопки |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateButton(CButton &button,const string name,const int x,
const int y,const string str,const int font_size,
const int clr)
{
//--- создание кнопки
if(!button.Create(m_chart_id,name,m_subwin,x,y,x+50,y+20))
return(false);
//--- текст
if(!button.Text(str))
return(false);
//--- размер шрифта
if(!button.FontSize(font_size))
return(false);
//--- цвет надписи
if(!button.Color(clr))
return(false);
//--- добавляем кнопку в элементы контроля
if(!Add(button))
return(false);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Создание списка для размера массива |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxStep(void)
{
//--- создание списка
if(!m_combo_box_step.Create(m_chart_id,"step_combobox",m_subwin,X_START+100,Y_START+185,X_START+200,Y_START+205))
return(false);
//--- добавление элементов в список
if(!m_combo_box_step.ItemAdd("100 000",100000))
return(false);
if(!m_combo_box_step.ItemAdd("1 000 000",1000000))
return(false);
if(!m_combo_box_step.ItemAdd("10 000 000",10000000))
return(false);
if(!m_combo_box_step.ItemAdd("100 000 000",100000000))
return(false);
//--- установим текущий элемент списка
if(!m_combo_box_step.SelectByValue(1000000))
return(false);
//--- добавляем список в элементы контроля
if(!Add(m_combo_box_step))
return(false);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Создание списка для типа массива |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxType(void)
{
//--- создание списка
if(!m_combo_box_type.Create(m_chart_id,"type_combobox",m_subwin,X_START+100,Y_START+210,X_START+200,Y_START+230))
return(false);
//--- добавление элементов в список
if(!m_combo_box_type.ItemAdd("char",0))
return(false);
if(!m_combo_box_type.ItemAdd("int",1))
return(false);
if(!m_combo_box_type.ItemAdd("float",2))
return(false);
if(!m_combo_box_type.ItemAdd("double",3))
return(false);
if(!m_combo_box_type.ItemAdd("long",4))
return(false);
//--- установим текущий элемент списка
if(!m_combo_box_type.SelectByValue(3))
return(false);
//--- запомним текущий элемент списка
m_combo_box_type_value=3;
//--- добавляем список в элементы контроля
if(!Add(m_combo_box_type))
return(false);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Создание надписи |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateLabel(CLabel &lbl,const string name,const int x,
const int y,const string str,const int font_size,
const int clr)
{
//--- создание надписи
if(!lbl.Create(m_chart_id,name,m_subwin,x,y,0,0))
return(false);
//--- текст
if(!lbl.Text(str))
return(false);
//--- размер шрифта
if(!lbl.FontSize(font_size))
return(false);
//--- цвет
if(!lbl.Color(clr))
return(false);
//--- добавляем надпись в элементы контроля
if(!Add(lbl))
return(false);
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| Обработчик события нажатия на кнопку "Add" |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonAdd(void)
{
//--- увеличим размер массива
m_arr_size+=(int)m_combo_box_step.Value();
//--- пытаемся выделить память под текущий массив
if(CurrentArrayAdd())
{
//--- память выделена, выведем текущее состояние на экран
m_lbl_memory_available.Text("Memory available = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb");
m_lbl_memory_used.Text("Memory used = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb");
m_lbl_array_size.Text("Array size = "+IntegerToString(m_arr_size));
m_lbl_error.Text("");
}
else
{
//--- не удалось выделить память, выводим сообщение об ошибке
m_lbl_error.Text("Array is too large, error!");
//--- вернем предыдущий размер массива
m_arr_size-=(int)m_combo_box_step.Value();
}
}
//+------------------------------------------------------------------+
//| Обработчик события нажатия на кнопку "Free" |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonFree(void)
{
//--- освобождаем память текущего массива
CurrentArrayFree();
//--- выведем текущее состояние на экран
m_lbl_memory_available.Text("Memory available = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb");
m_lbl_memory_used.Text("Memory used = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb");
m_lbl_array_size.Text("Array size = 0");
m_lbl_error.Text("");
}
//+------------------------------------------------------------------+
//| Обработчик события изменения списка |
//+------------------------------------------------------------------+
void CMemoryControl::OnChangeComboBoxType(void)
{
//--- проверка, изменился ли тип массива
if(m_combo_box_type.Value()!=m_combo_box_type_value)
{
//--- освобождаем память текущего массива
OnClickButtonFree();
//--- работаем с другим типом массива
m_combo_box_type_value=(int)m_combo_box_type.Value();
//--- выведем на экран новый тип массива
if(m_combo_box_type_value==0)
m_lbl_array_type.Text("Array type = char");
if(m_combo_box_type_value==1)
m_lbl_array_type.Text("Array type = int");
if(m_combo_box_type_value==2)
m_lbl_array_type.Text("Array type = float");
if(m_combo_box_type_value==3)
m_lbl_array_type.Text("Array type = double");
if(m_combo_box_type_value==4)
m_lbl_array_type.Text("Array type = long");
}
}
//--- объект класса CMemoryControl
CMemoryControl ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- создание диалога
if(!ExtDialog.Create(0,"MemoryControl",0,X_START,Y_START,X_SIZE,Y_SIZE))
return(INIT_FAILED);
//--- запуск
ExtDialog.Run();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
ExtDialog.Destroy(reason);
}
//+------------------------------------------------------------------+
//| Expert chart event function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
ExtDialog.ChartEvent(id,lparam,dparam,sparam);
}


ArrayGetAsSeries

Справочник MQL4 / Операции с массивами / ArrayGetAsSeries

ArrayGetAsSeries

Проверяет направление индексации массива.

bool ArrayGetAsSeries(
const void& array[] // массив для проверки
);

Параметры

array[]

[in] Проверяемый массив.

Возвращаемое значение

Возвращает true, если у указанного массива установлен флаг AS_SERIES, то есть доступ к массиву осуществляется задом наперед как в таймсерии. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым).

Примечание

Для проверки массива на принадлежность к таймсерии следует применять функцию ArrayIsSeries(). Массивы ценовых данных, переданных в качестве входных параметров в функцию OnCalculate(), не обязательно имеют направление индексации как у таймсерий. Нужное направление индексации можно установить функцией ArraySetAsSeries().

Пример:

#property indicator_chart_window
#property description "Индикатор вычисляет абсолютные значения разницы между ценами"
#property description "Open и Close или High и Low, и отображает их в отдельном подокне"
#property description "в виде гистограммы."
//--- настройки индикатора
#property indicator_separate_window
#property indicator_buffers 1
//--- входные параметры
input bool InpAsSeries=true; // Направление индексации в индикаторном буфере
input bool InpPrices=true; // Цены для расчета (true - Open,Close; false - High,Low)
//--- индикаторный буфер
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Вычисление значений индикатора |
//+------------------------------------------------------------------+
void CandleSizeOnBuffer(const int rates_total,const int prev_calculated,
const double &first[],const double &second[],double &buffer[])
{
//--- переменная начала для рассчета баров
int start_index=prev_calculated;
//--- если значения индикатора уже были рассчитаны на предыдущем тике, то работаем на последнем баре
if(prev_calculated>0)
start_index--;
//--- определим направление индексации в массивах
bool as_series_first=ArrayGetAsSeries(first);
bool as_series_second=ArrayGetAsSeries(second);
bool as_series_buffer=ArrayGetAsSeries(buffer);
//--- изменим направление индексации на прямое, если необходимо
if(as_series_first)
ArraySetAsSeries(first,false);
if(as_series_second)
ArraySetAsSeries(second,false);
if(as_series_buffer)
ArraySetAsSeries(buffer,false);
//--- рассчитаем значения индикатора
for(int i=start_index;i<rates_total;i++)
buffer[i]=MathAbs(first[i]-second[i]);
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- привязка индикаторных буферов
SetIndexBuffer(0,ExtBuffer);
//--- установим направление индексации в индикаторном буфере
ArraySetAsSeries(ExtBuffer,InpAsSeries);
//--- проверяем для каких цен рассчитывается индикатор
if(InpPrices)
{
//--- цены Open и Close
IndicatorShortName("BodySize");
//--- установим цвет индикатора
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3,clrOrange);
}
else
{
//--- цены High и Low
IndicatorShortName("ShadowSize");
//--- установим цвет индикатора
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3,clrDodgerBlue);
}
//---
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[])
{
//--- расчет индикатора в зависимости от значения флага
if(InpPrices)
CandleSizeOnBuffer(rates_total,prev_calculated,open,close,ExtBuffer);
else
CandleSizeOnBuffer(rates_total,prev_calculated,high,low,ExtBuffer);
//--- return value of prev_calculated for next call
return(rates_total);
}

Смотри также

Доступ к таймсериям, ArraySetAsSeries


ArrayInitialize

Справочник MQL4 / Операции с массивами / ArrayInitialize

ArrayInitialize

Инициализирует числовой массив указанным значением.

Для инициализации массива типа char

int ArrayInitialize(
char array[], // инициализируемый массив
char value // значение, которое будет установлено
);

Для инициализации массива типа short

int ArrayInitialize(
short array[], // инициализируемый массив
short value // значение, которое будет установлено
);

Для инициализации массива типа int

int ArrayInitialize(
int array[], // инициализируемый массив
int value // значение, которое будет установлено
);

Для инициализации массива типа long

int ArrayInitialize(
long array[], // инициализируемый массив
long value // значение, которое будет установлено
);

Для инициализации массива типа float

int ArrayInitialize(
float array[], // инициализируемый массив
float value // значение, которое будет установлено
);

Для инициализации массива типа double

int ArrayInitialize(
double array[], // инициализируемый массив
double value // значение, которое будет установлено
);

Для инициализации массива типа bool

int ArrayInitialize(
bool array[], // инициализируемый массив
bool value // значение, которое будет установлено
);

Для инициализации массива типа uint

int ArrayInitialize(
uint array[], // инициализируемый массив
uint value // значение, которое будет установлено
);

Параметры

array[]

[out] Числовой массив, который нужно инициализировать.

value

[in] Новое значение, которое нужно установить всем элементам массива.

Возвращаемое значение

Количество инициализированных элементов.

Примечание

Функция ArrayResize() позволяет задать для массива размер с некоторым запасом для его будущего увеличения без физического перераспределения памяти. Это сделано для улучшения быстродействия, так как операции по распределению памяти являются достаточно медленными.

Инициализация массива выражением ArrayInitialize(array, init_val) не означает инициализацию этим же значением и элементов резерва, выделенного для этого массива. При последующих увеличениях размера массива array функцией ArrayResize() в пределах текущего резерва, в конец массива добавляются элементы, значения которых не определены и, чаще всего, не равны init_val.

Пример:

void OnStart()
{
//--- динамический массив
double array[];
//--- зададим размер массива для 100 элементов и зарезервируем еще буфер в 10 элементов
ArrayResize(array,100,10);
//--- инициализируем элементы массива значением EMPTY_VALUE=DBL_MAX
ArrayInitialize(array,EMPTY_VALUE);
Print("Значения последних 10 элементов массива после инициализации");
for(int i=90;i<100;i++) printf("array[%d] = %G",i,array[i]);
//--- увеличим размер массива на 5 элементов
ArrayResize(array,105);
Print("Значения последних 10 элементов массива после ArrayResize(array,105)");
//--- значения последних 5 элементов были получены из буфера резерва
for(int i=95;i<105;i++) printf("array[%d] = %G",i,array[i]);
}


ArrayFill

Справочник MQL4 / Операции с массивами / ArrayFill

ArrayFill

Заполняет числовой массив указанным значением.

void ArrayFill(
void& array[], // массив
int start, // индекс начального элемента
int count, // количество элементов
void value // значение, которым заполняется массив
);

Параметры

array[]

[out] Массив простого типа (char, uchar, short, ushort, int, uint, long, ulong, bool, color, datetime, float, double).

start

[in] Индекс начального элемента (с какого элемента заполнять). При этом не учитывается установленный флаг серийности.

count

[in] Количество элементов, которое следует заполнить.

value

[in] Значение, которым заполняется массив.

Возвращаемое значение

Нет возвращаемого значения.

Примечание

При вызове функции ArrayFill() всегда подразумевается обычное направление индексации – слева направо, то есть изменение порядка доступа к элементам массива с помощью функции ArraySetAsSeries() не принимается во внимание.

Многомерный массив при обработке функцией ArrayFill() представляется одномерным, например, массив array[2][4] обрабатывается как array[8], поэтому при работе с этим массивом допустимо указать индекс начального элемента равным 5. Таким образом, вызов ArrayFill(array, 5, 2, 3.14) для массива array[2][4] заполнит значением 3.14 элементы массива array[1][1] и array[1][2].

Пример:

void OnStart()
{
//--- объявляем динамический массив
int a[];
//--- устанавливаем размер
ArrayResize(a,10);
//--- заполняем начальные 5 элементов значением 123
ArrayFill(a,0,5,123);
//--- заполняем 5 элементов (начиная с 5-го) значением 456
ArrayFill(a,5,5,456);
//--- выводим значения всех элементов
for(int i=0;i<ArraySize(a);i++) printf("a[%d] = %d",i,a[i]);
}


ArrayIsDynamic

Справочник MQL4 / Операции с массивами / ArrayIsDynamic

ArrayIsDynamic

Проверяет, является ли массив динамическим.

bool ArrayIsDynamic(
const void& array[] // проверяемый массив
);

Параметры

array[]

[in] Проверяемый массив.

Возвращаемое значение

Возвращает true, если указанный массив является динамическим, иначе возвращается false.

Пример:

#property description "Этот индикатор не вычисляет значений, а один раз пытается применить"
#property description "вызов функции ArrayFree() к трем массивам: динамическому, статическому и"
#property description "индикаторному буферу. Результаты выводятся в журнал экспертов."
//--- настройки индикатора
#property indicator_chart_window
#property indicator_buffers 1
//--- глобальные переменные
double ExtDynamic[]; // динамический массив
double ExtStatic[100]; // статический массив
bool ExtFlag=true; // флаг
double ExtBuff[]; // индикаторный буфер
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- выделим память для массива
ArrayResize(ExtDynamic,100);
//--- indicator buffers mapping
SetIndexBuffer(0,ExtBuff);
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
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[])
{
//--- проведем анализ один раз
if(ExtFlag)
{
//--- попробуем освободить память для массивов
//--- 1. Динамический массив
Print("+============================+");
Print("1. Проверка динамического массива:");
Print("Размер до освобождения памяти = ",ArraySize(ExtDynamic));
Print("Это динамический массив = ",ArrayIsDynamic(ExtDynamic) ? "Да" : "Нет");
//--- пытаемся освободить память массива
ArrayFree(ExtDynamic);
Print("Размер после освобождения памяти = ",ArraySize(ExtDynamic));
//--- 2. Статический массив
Print("2. Проверка статического массива:");
Print("Размер до освобождения памяти = ",ArraySize(ExtStatic));
Print("Это динамический массив = ",ArrayIsDynamic(ExtStatic) ? "Да" : "Нет");
//--- пытаемся освободить память массива
ArrayFree(ExtStatic);
Print("Размер после освобождения памяти = ",ArraySize(ExtStatic));
//--- 3. Индикаторный буфер
Print("3. Проверка индикаторного буфера:");
Print("Размер до освобождения памяти = ",ArraySize(ExtBuff));
Print("Это динамический массив = ",ArrayIsDynamic(ExtBuff) ? "Да" : "Нет");
//--- пытаемся освободить память массива
ArrayFree(ExtBuff);
Print("Размер после освобождения памяти = ",ArraySize(ExtBuff));
//--- изменим значение флага
ExtFlag=false;
}
//--- return value of prev_calculated for next call
return(rates_total);
}

Смотри также

Доступ к таймсериям и индикаторам


ArrayIsSeries

Справочник MQL4 / Операции с массивами / ArrayIsSeries

ArrayIsSeries

Проверяет, является ли массив таймсерией.

bool ArrayIsSeries(
const void& array[] // проверяемый массив
);

Параметры

array[]

[in] Проверяемый массив.

Возвращаемое значение

Возвращается true, если проверяемый массив является массивом-таймсерией, иначе возвращается false. Массивы, передаваемые в качестве параметра функции OnCalculate(), необходимо проверять на порядок доступа к элементам массива функцией ArrayGetAsSeries().

Пример:

#property indicator_chart_window
#property indicator_buffers 1
//---- plot Label1
#property indicator_label1 "Label1"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- indicator buffers
double Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
if(ArrayIsSeries(open))
Print("open[] is timeseries");
else
Print("open[] is not timeseries!!!");
//--- return value of prev_calculated for next call
return(rates_total);
}

Смотри также

Доступ к таймсериям и индикаторам


ArrayMaximum

Справочник MQL4 / Операции с массивами / ArrayMaximum

ArrayMaximum

Ищет в одномерном числовом массиве максимальный элемент.

int ArrayMaximum(
const void& array[], // массив для поиска
int count=WHOLE_ARRAY, // количество проверяемых
int start=0 // с какого индекса начинаем поиск
);

Параметры

array[]

[in] Числовой массив, в котором производится поиск.

count=WHOLE_ARRAY

[in] Количество элементов для поиска. По умолчанию, ищет во всем массиве (count=WHOLE_ARRAY).

start=0

[in] Начальный индекс для поиска.

Возвращаемое значение

Функция возвращает индекс найденного элемента с учетом серийности массива. В случае неудачи функция возвращает -1.

Пример:

void OnStart()
{
//---
double num_array[15]={4,1,6,3,19,4,2,6,3,9,4,5,6,3,9};
int maxValueIdx=ArrayMaximum(num_array,WHOLE_ARRAY,0);
Print("Max value = ",num_array[maxValueIdx]," at index=",maxValueIdx);
}

Смотри также

ArrayMinimum()


ArrayMinimum

Справочник MQL4 / Операции с массивами / ArrayMinimum

ArrayMinimum

Ищет в одномерном числовом массиве минимальный элемент.

int ArrayMinimum(
const void& array[], // массив для поиска
int count=WHOLE_ARRAY, // количество проверяемых
int start=0 // с какого индекса начинаем поиск
);

Параметры

array[]

[in] Числовой массив, в котором производится поиск.

count=WHOLE_ARRAY

[in] Количество элементов для поиска. По умолчанию, ищет во всем массиве (count=WHOLE_ARRAY).

start=0

[in] Начальный индекс для поиска.

Возвращаемое значение

Функция возвращает индекс найденного элемента с учетом серийности массива. В случае неудачи функция возвращает -1.

Пример:

void OnStart()
{
//---
double num_array[15]={4,1,6,3,19,4,2,6,3,9,4,5,6,3,9};
int minValueIdx=ArrayMinimum(num_array,WHOLE_ARRAY,0);
Print("Min value = ",num_array[minValueIdx]," at index=",minValueIdx);
}

Смотри также

ArrayMaximum()


ArrayRange

Справочник MQL4 / Операции с массивами / ArrayRange

ArrayRange

Возвращает число элементов в указанном измерении массива.

int ArrayRange(
const void& array[], // массив для проверки
int rank_index // номер измерения
);

Параметры

array[]

[in] Проверяемый массив.

rank_index

[in] Индекс измерения.

Возвращаемое значение

Число элементов в указанном измерении массива

Примечание

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

Пример:

void OnStart()
{
//--- создадим четырехмерный массив
double array[][5][2][4];
//--- зададим размер нулевого измерения
ArrayResize(array,10,10);
//--- распечатаем размерности измерений
int temp;
for(int i=0;i<4;i++)
{
//--- получим размер i-ого измерения
temp=ArrayRange(array,i);
//--- распечатаем
PrintFormat("dim = %d, range = %d",i,temp);
}
//--- Результат
// dim = 0, range = 10
// dim = 1, range = 5
// dim = 2, range = 2
// dim = 3, range = 4
}


ArrayResize

Справочник MQL4 / Операции с массивами / ArrayResize

ArrayResize

Устанавливает новый размер в первом измерении массива

int ArrayResize(
void& array[], // массив, переданный по ссылке
int new_size, // новый размер массива
int reserve_size=0 // резервное значение размера (избыточное)
);

Параметры

array[]

[out] Массив для изменения размеров.

new_size

[in] Новый размер для первого измерения.

reserve_size=0

[in] Необязательный параметр. Размер для дополнительного резерва.

Возвращаемое значение

При успешном выполнении функция возвращает количество всех элементов, содержащихся в массиве после изменения размера; в противном случае возвращает -1 и массив не меняет размеры.

Примечание

Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала.

Общее число элементов в массиве не может превышать 2147483647.

При частом распределении памяти рекомендуется использовать третий параметр, задающий резерв для уменьшения количества физического распределения памяти. Все последующие вызовы функции ArrayResize не приводят к физическому перераспределению памяти, а только меняется размер первого измерения массива в пределах зарезервированной памяти. Следует помнить, что третий параметр будет использоваться только тогда, когда будет происходить физическое распределение памяти, например:

ArrayResize(arr,1000,1000);
for(int i=1;i<3000;i++)
ArrayResize(arr,i,1000);

В данном случае произойдёт 2 перераспределения памяти, один раз до входа в цикл на 2000 элементов, при этом размерность массива будет установлена в 1000 и второй при i равной 2000. Если третий параметр опустить, то произойдёт 2000 физических перераспределения памяти и это замедлит выполнение программы.

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- счетчики
ulong start=GetTickCount();
ulong now;
int count=0;
//--- массив для демонстрации быстрого варианта
double arr[];
ArrayResize(arr,100000,100000);
//--- проверим, как быстро работает вариант с резервированием памяти
Print("--- Test Fast: ArrayResize(arr,100000,100000)");
for(int i=1;i<=300000;i++)
{
//--- задаем новый размер массива с указанием резерва в 100000 элементов!
ArrayResize(arr,i,100000);
//--- при достижении круглой цифры выводим размер массива и затраченное время
if(ArraySize(arr)%100000==0)
{
now=GetTickCount();
count++;
PrintFormat("%d. ArraySize(arr)=%d Time=%d ms",count,ArraySize(arr),(now-start));
start=now;
}
}
//--- покажем теперь, как медленно работает вариант без резервирования памяти
double slow[];
ArrayResize(slow,100000,100000);
//---
count=0;
start=GetTickCount();
Print("---- Test Slow: ArrayResize(slow,100000)");
//---
for(int i=1;i<=300000;i++)
{
//--- задаем новый размер массива, но уже без дополнительного резерва
ArrayResize(slow,i);
//--- при достижении круглой цифры выводим размер массива и затраченное время
if(ArraySize(slow)%100000==0)
{
now=GetTickCount();
count++;
PrintFormat("%d. ArraySize(slow)=%d Time=%d ms",count,ArraySize(slow),(now-start));
start=now;
}
}
}
//--- Примерный результат выполнения скрипта
/*
Test_ArrayResize (EURUSD,H1) --- Test Fast: ArrayResize(arr,100000,100000)
Test_ArrayResize (EURUSD,H1) 1. ArraySize(arr)=100000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 2. ArraySize(arr)=200000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 3. ArraySize(arr)=300000 Time=0 ms
Test_ArrayResize (EURUSD,H1) ---- Test Slow: ArrayResize(slow,100000)
Test_ArrayResize (EURUSD,H1) 1. ArraySize(slow)=100000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 2. ArraySize(slow)=200000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 3. ArraySize(slow)=300000 Time=228511 ms
*/

Смотри также

ArrayInitialize


ArraySetAsSeries

Справочник MQL4 / Операции с массивами / ArraySetAsSeries

ArraySetAsSeries

Устанавливает флаг AS_SERIES указанному объекту динамического массива, индексация элементов массива будет производиться как в таймсериях.

bool ArraySetAsSeries(
const void& array[], // массив по ссылке
bool flag // true означает обратный порядок индексации
);

Параметры

array[]

[in][out] Числовой массив для установки.

flag

[in] Направление индексирования массива.

Возвращаемое значение

Возвращает true в случае успеха, иначе false.

Примечание

Флаг AS_SERIES не может быть установлен у многомерных массивов и у статических массивов (то есть массивов, чей размер в квадратных скобках указан еще на этапе компиляции). Индексация в таймсерии отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым).

Пример: индикатор, показывающий номер бара

Индикатор для отображения номера бара

#property indicator_chart_window
#property indicator_buffers 1
//--- indicator buffers
double NumerationBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,NumerationBuffer,INDICATOR_DATA);
//--- set buffer style
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,CLR_NONE);
//--- установим индексацию для буфера как в таймсерии
ArraySetAsSeries(NumerationBuffer,true);
//--- установим точность отборажения в DataWindow
IndicatorSetInteger(INDICATOR_DIGITS,0);
//--- как будет выглядеть в DataWindow имя индикатора
IndicatorShortName("Bar #");
//---
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[])
{
//--- будем хранить время открытия текущего нулевого бара
static datetime currentBarTimeOpen=0;
//--- перевернем доступ к массиву time[] - сделаем как в таймсерии
ArraySetAsSeries(time,true);
//--- если время нулевого бара отличается от того, что мы храним
if(currentBarTimeOpen!=time[0])
{
//--- пронумеруем все бары от текущего момента вглубь графика
for(int i=rates_total-1;i>=0;i--) NumerationBuffer[i]=i;
currentBarTimeOpen=time[0];
}
//--- return value of prev_calculated for next call
return(rates_total);
}

Смотри также

Доступ к таймсериям, ArrayGetAsSeries


ArraySize

Справочник MQL4 / Операции с массивами / ArraySize

ArraySize

Возвращает количество элементов указанного массива.

int ArraySize(
const void& array[] // проверяемый массив
);

Параметры

array[]

[in] Массив любого типа.

Возвращаемое значение

Значение типа int.

Примечание

Для одномерного массива значение, возвращаемое функцией ArraySize, равно значению ArrayRange(array,0).

Пример:

void OnStart()
{
//--- создание массивов
double one_dim[];
double four_dim[][10][5][2];
//--- размеры
int one_dim_size=25;
int reserve=20;
int four_dim_size=5;
//--- вспомогательная переменная
int size;
//--- выделим память без резервирования
ArrayResize(one_dim,one_dim_size);
ArrayResize(four_dim,four_dim_size);
//--- 1. одномерный массив
Print("+==========================================================+");
Print("Размеры массивов:");
Print("1. Одномерный массив");
size=ArraySize(one_dim);
PrintFormat("Размер нулевого измерения = %d, Размер массива = %d",one_dim_size,size);
//--- 2. многомерный массив
Print("2. Многомерный массив");
size=ArraySize(four_dim);
PrintFormat("Размер нулевого измерения = %d, Размер массива = %d",four_dim_size,size);
//--- размеры измерений
int d_1=ArrayRange(four_dim,1);
int d_2=ArrayRange(four_dim,2);
int d_3=ArrayRange(four_dim,3);
Print("Проверка:");
Print("Нулевое измерение = Размер массива / (Первое измерение * Второе измерение * Третье измерение)");
PrintFormat("%d = %d / (%d * %d * %d)",size/(d_1*d_2*d_3),size,d_1,d_2,d_3);
//--- 3. одномерный массив с резервированием памяти
Print("3. Одномерный массив с резервированием памяти");
//--- увеличим значение в 2 раза
one_dim_size*=2;
//--- выделим память с резервированием
ArrayResize(one_dim,one_dim_size,reserve);
//--- распечатаем размер
size=ArraySize(one_dim);
PrintFormat("Размер с резервированием = %d, Реальный размер массива = %d",one_dim_size+reserve,size);
}


ArraySort

Справочник MQL4 / Операции с массивами / ArraySort

ArraySort

Сортировка числовых массивов по первому измерению. Сортировка производится с учетом флага AS_SERIES.

bool ArraySort(
void& array[] // массив для сортировки
int count=WHOLE_ARRAY, // количество элементов
int start=0, // начальный индекс
int direction=MODE_ASCEND // направление сортировки
);

Параметры

array[]

[in][out] Числовой массив для сортировки.

count

[in] Количество элементов.

start

[in] Начальный индекс.

direction

[in] Направление сортировки массива. Возможные значения:

MODE_ASCEND - сортировка в порядке возрастания

MODE_DESCEND - сортировка в порядке убывания.

Возвращаемое значение

Возвращает true в случае успеха, иначе false.

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- пример сортировки одномерного массива
double num_array[5]={4,1,6,3,9};
//--- массив содержит величины 4,1,6,3,9
ArraySort(num_array);
//--- теперь массив отсортирован 1,3,4,6,9
ArraySort(num_array,WHOLE_ARRAY,0,MODE_DESCEND);
//--- теперь массив отсортирован 9,6,4,3,1

//--- пример сортировки двумерного массива по первому измерению
//--- заполнение массива 5x2
int DataArray[5][2]={{7,3},{3,1},{57,14},{12,4},{11,1}};
//--- сортировка массива DataArray[][] по первому измерению (по возрастанию значений)
ArraySort(DataArray,WHOLE_ARRAY,0,MODE_ASCEND);
//--- вывод результатов
for(int i=0; i<5; i++)
{
string str="index "+IntegerToString(i)+": ";
for(int j=0; j<2; j++)
{
if(j==0) str+="{"; else str+=",";
str+=IntegerToString(DataArray[i,j]);
if(j==1) str+="}";
}
Print(str);
}
//--- результат
//index 0: {3,1}
//index 1: {7,3}
//index 2: {11,1}
//index 0: {12,4}
//index 4: {57,14}
}


ArrayCopyRates

Справочник MQL4 / Операции с массивами / ArrayCopyRates

ArrayCopyRates

Копирует в массив данные баров указанного графика и возвращает количество скопированных баров. Существует 2 варианта вызова функции:

int ArrayCopyRates(
MqlRates& rates_array[], // массив MqlRates, переданный по ссылке
string symbol=NULL, // инструмент
int timeframe=0 // таймфрейм
);

Копирует в двумерный массив вида double RateInfo[][6] данные баров указанного графика и возвращает количество скопированных баров.

int ArrayCopyRates(
void& dest_array[][], // массив, переданный по ссылке
string symbol=NULL, // инструмент
int timeframe=0 // таймфрейм
);

Параметры

rates_array[]

[out] Ссылка на массив структур MqlRates.

dest_array[][]

[out] Ссылка на двумерный массив типа double.

symbol=NULL

[in] Наименование инструмента (символ валютной пары).

timeframe=0

[in] Период. Может быть любым значением из перечисления ENUM_TIMEFRAMES.

Возвращаемое значение

Возвращает количество скопированных баров, либо -1 в случае неудачи.

Если копируются данные "чужого" инструмента и/или таймфрейма, то возможна ситуация отсутствия требуемых данных. В этом случае в переменную last_error будет помещена ошибка ERR_HISTORY_WILL_UPDATED (4066 - запрошенные исторические данные в состоянии обновления) и необходимо через некоторое время повторить попытку копирования (см. пример в ArrayCopySeries()).

Примечание

Обычно массив используется для передачи данных в DLL функцию.При использовании первой формы вызова происходит виртуальное копирование таймсерии в массив структур MqlRates. Это означает, что если данные таймсерии обновились, то повторное копирование не требуется - массив rates_array[] по-прежнему будет ссылаться на актуальную версию таймсерии и данные будут корректными всегда.

При использовании второй формы вызова происходит реальное копирование данных в массив dest_array[][], сам массив автоматически перераспределяется, чтобы соответствовать размеру таймсерии (даже если массив был объявлен статическим).

Первое измерение массива содержит количество баров. Второе измерение имеет 6 элементов со значениями:

0 - время (time),
1 - цена открытия (open),
2 - наименьшая цена (low),
3 - наивысшая цена (high),
4 - цена закрытия (close),
5 - объём (volume).

Пример:

#property copyright "Copyright © 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property description "Советник для демонстрации двух вариантов"
#property description "вызова функции ArrayCopyRates()"
//--- массив для физического копирования исторических данных
double double_array[][6];
//--- массив для получения исторических данных без физического копирования
MqlRates mqlrates_array[];
//--- флаг первого запуска эксперта
bool first_call;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- для лучшей наглядности просим запустить эксперта на минутном таймфрейме
if(Period()!=PeriodSeconds(PERIOD_M1)/60)
{
Alert("Необходимо запустить на M1!");
return(INIT_FAILED);
}
//--- это первый запуск
first_call=true;
//--- всё хорошо
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- удалим с графика комментарии при завершении работы
Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(first_call)
{
//--- физически копируем данные в массив double_array
ArrayCopyRates(double_array,NULL,0);
//--- виртуальное копирование -> mqlrates_array будет просто ссылаться на данные
ArrayCopyRates(mqlrates_array,NULL,0);
//--- первый запуск уже был
first_call=false;
}
//--- выводим на каждом тике значения элемента с нулевым индексом и видим разницу между ними
Comment("Значения в массиве double не меняются (реальное копирование):\n",
"0 - время (time): ",(datetime)double_array[0][0],"\n",
"1 - цена открытия (open): ",double_array[0][1],"\n"
"2 - наименьшая цена (low): ",double_array[0][2],"\n"
"3 - наивысшая цена (high): ",double_array[0][3],"\n"
"4 - цена закрытия (close): ",double_array[0][4],"\n"
"5 - объём (volume): ",DoubleToString(double_array[0][5],0),"\n\n",
"Значения в массиве MqlRates обновляются (виртуальное копирование):\n",
"0 - время (time): ",mqlrates_array[0].time,"\n",
"1 - цена открытия (open): ",mqlrates_array[0].open,"\n"
"2 - наименьшая цена (low): ",mqlrates_array[0].low,"\n"
"3 - наивысшая цена (high): ",mqlrates_array[0].high,"\n"
"4 - цена закрытия (close): ",mqlrates_array[0].close,"\n"
"5 - объём (volume): ",mqlrates_array[0].tick_volume);
}


ArrayCopySeries

Справочник MQL4 / Операции с массивами / ArrayCopySeries

ArrayCopySeries

Копирует массив-таймсерию в пользовательский массив и возвращает количество скопированных элементов.

int ArrayCopySeries(
void& array[], // массив, переданный по ссылке
int series_index, // идентификатор массива-таймсерии
string symbol=NULL, // инструмент
int timeframe=0 // таймфрейм
);

Параметры

array[]

[out] Ссылка на одномерный числовой массив.

series_index

[in] Идентификатор массива-таймсерии. Должен быть одним из перечисленных идентификаторов таймсерий.

symbol

[in] Наименование инструмента (символ валютной пары).

timeframe

[in] Период. Может быть любым значением из перечисленных периодов.

Возвращаемое значение

Возвращает количество скопированных элементов, либо -1 в случае неудачи.

Если копируются данные "чужого" инструмента и/или таймфрейма, то возможна ситуация отсутствия требуемых данных. В этом случае в переменную last_error будет помещена ошибка ERR_HISTORY_WILL_UPDATED (4066 - запрошенные исторические данные в состоянии обновления) и необходимо через некоторое время повторить попытку копирования.

Примечание

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

Замечание: если series_index - MODE_TIME, то передаваемый в функцию массив должен иметь тип datetime[].

Пример:

datetime daytimes[];
int shift=10,dayshift,error;
//---- массив Time[] отсортирован в порядке убывания
ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);
error=GetLastError();
if(error==4066)
{
//---- делаем еще 2 попытки чтения
for(int i=0;i<2; i++)
{
Sleep(5000);
ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);
//---- проверим время текущего дневного бара
datetime last_day=daytimes[0];
if(Year()==TimeYear(last_day) && Month()==TimeMonth(last_day) && Day()==TimeDay(last_day)) break;
}
}
if(Time[shift]>=daytimes[0]) dayshift=0;
else
{
dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND);
if(Period()<PERIOD_D1) dayshift++;
}
Print(TimeToStr(Time[shift])," corresponds to ",dayshift," day bar opened at ", TimeToStr(daytimes[dayshift]));


ArrayDimension

Справочник MQL4 / Операции с массивами / ArrayDimension

ArrayDimension

Возвращает ранг многомерного массива.

int ArrayDimension(
void& array[] // массив
);

Параметры

array[]

[in] Массив, для которого будет возвращен ранг.

Возвращаемое значение

Размерность многомерного массива, либо -1 в случае неудачи.

Пример:

void OnStart()
{
int num_array[10][5];
int dim_size=ArrayDimension(num_array);// dim_size=2
Print("Размерность массива num_array=",dim_size);
}


Преобразование данных

Справочник MQL4 / Преобразование данных

Преобразование данных

Группа функций, обеспечивающих преобразование данных из одного формата в данные другого формата.

Особо следует отметить функцию NormalizeDouble(), которая обеспечивает требуемую точность представления цены. В торговых операциях нельзя использовать ненормализованные цены, чья точность превышает требуемую торговым сервером хотя бы на один знак.

Функция | Действие
CharToString | Преобразование кода символа в односимвольную строку
DoubleToString | Преобразование числового значения в текстовую строку с указанной точностью
EnumToString | Преобразование значения перечисления любого типа в строку
NormalizeDouble | Округление числа с плавающей точкой до указанной точности
StringToDouble | Преобразование строки, содержащей символьное представление числа, в число типа double
StringToInteger | Преобразование строки, содержащей символьное представление числа, в число типа int
StringToTime | Преобразование строки, содержащей время и/или дату в формате "yyyy.mm.dd [hh:mi]", в число типа datetime
TimeToString | Преобразование значения, содержащего время в секундах, прошедшее с 01.01.1970, в строку формата "yyyy.mm.dd hh:mi"
IntegerToString | Преобразование значения целого типа в строку указанной длины
ShortToString | Преобразование код символа (unicode) в односимвольную строку
ShortArrayToString | Копирует часть массива в строку
StringToShortArray | Посимвольно копирует строку в указанное место массива типа ushort
CharArrayToString | Преобразует код символа (ansi) в односимвольную строку
StringToCharArray | Посимвольно копирует преобразованную из Unicode в ANSI строку в указанное место массива типа uchar
ColorToARGB | Преобразует тип color в тип uint для получения ARGB-представления цвета
ColorToString | Преобразует значение цвета в строку вида "R,G,B"
StringToColor | Преобразует строку типа "R,G,B" или строку, содержащую наименование цвета, в значение типа color
StringFormat | Преобразует число в строку в соответствие с заданным форматом
CharToStr | Преобразует код символа в односимвольную строку
DoubleToStr | Преобразует числовое значение в текстовую строку, содержащую символьное представление числа в указанном формате точности
StrToDouble | Преобразует строку, содержащую символьное представление числа, в число типа double
StrToInteger | Преобразует строку, содержащую символьное представление числа, в число типа int
StrToTime | Преобразует строку, содержащую время и/или дату в формате "yyyy.mm.dd [hh:mi]", в число типа datetime
TimeToStr | Преобразует значение, содержащее время в секундах, прошедшее с 01.01.1970, в строку формата "yyyy.mm.dd hh:mi".

Что нового в MQL5

Добавлены функции CharArrayToStruct и StructToCharArray для конвертации массива uchar в бинарную последовательность и наоборот. Это упрощает обмен байтовыми данными при работе с DLL.

Смотри также

Использование кодовой страницы


CharToString

Справочник MQL4 / Преобразование данных / CharToString

CharToString

Преобразование кода символа в односимвольную строку.

string CharToString(
uchar char_code // числовой код символа
);

Параметры

char_code

[in] Код символа ANSI.

Возвращаемое значение

Строка, содержащая символ ANSI.


CharArrayToString

Справочник MQL4 / Преобразование данных / CharArrayToString

CharArrayToString

Копирует и преобразует часть массива типа uchar в возвращаемую строку.

string CharArrayToString(
uchar array[], // массив
int start=0, // начальная позиция в массиве
int count=-1, // количество символов
uint codepage=CP_ACP // кодовая страница
);

Параметры

array[]

[in] Массив типа uchar.

start=0

[in] Позиция, с которой начинается копирование. По умолчанию 0.

count=-1

[in] Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0.

codepage=CP_ACP

[in] Значение кодовой страницы. Для наиболее употребимых кодовых страниц предусмотрены соответствующие константы.

Возвращаемое значение

Строка.

Смотри также

Использование кодовой страницы


ColorToARGB

Справочник MQL4 / Преобразование данных / ColorToARGB

ColorToARGB

Преобразует тип color в тип uint для получения ARGB-представления цвета. ARGB формат цвета используется при создании графического ресурса, вывода текста и в классе стандартной библиотеки CCanvas.

uint ColorToARGB(
color clr, // преобразуемый цвет в формате color
uchar alpha=255 // альфа-канал, управляющий прозрачностью цвета
);

Параметры

clr

[in] Значение цвета в переменной типа color.

alpha

[in] Значение альфа-канала, для получения цвета в формате ARGB. Задается значением от 0 (цвет накладываемого пикселя совсем не меняет отображения нижележащего пикселя) до 255 (цвет накладывается полностью и перекрывает собою цвет нижележащего пикселя). Прозрачность цвета в процентом выражении вычисляется как (1-alpha/255)*100%, то есть чем меньше значение альфа-канала, тем более прозрачен цвет.

Возвращаемое значение

Представление цвета в формате ARGB, где в четырех байтах типа uint прописаны по порядку значения Alfa, Red, Green, Blue (альфа-канал, красный, зеленый, голубой).

Примечание

Основным общеупотребимым форматом для описания цвета пикселя на экране дисплея в компьютерной графике является RGB, где по названиям базовых цветов задаются красная (Red), зеленая (Green) и синяя (Blue) компоненты цвета. Каждая компонента описывается одним байтом, задающим насыщенность данного цвета в интервале от 0 до 255 (от 0x00 до 0XFF в шестнадцатеричном формате). Так как белый цвет содержит в себе все цвета, то он описывается как 0xFFFFFF, то есть каждая из трех компонент представлена максимальным значением 0xFF.

Но в ряде задач требуется указание прозрачности цвета, чтобы описать, каким образом будет выглядеть изображение, если на него наложен цвет с некоторой долей прозрачности. Для таких случаев вводится понятие альфа-канала (Alpha), который вводится как дополнительная компонента к формату RGB. Схема формата ARGB показана на рисунке.

Значения в виде ARGB обычно указываются в шестнадцатеричном формате, где каждая пара цифр представляет по порядку значения каналов Alpha, Red, Green и Blue. Например, ARGB-цвет 80FFFF00 означает желтый цвет с непрозрачностью 50.2 %. В начале идет 0x80, которое задает 50.2% значение альфа-канала, так как это 50.2% от значения 0xFF; далее первая пара FF представляет максимальное значение красной компоненты; следующая пара FF задает такую же силу зеленой компоненты; и последняя пара 00 представляет минимальное значение синей компоненты (отсутствие синего). Сложение зеленого и красного цвета дает желтый. Если альфа-канал не используется, запись может быть сокращена до 6 цифр RRGGBB, вот почему значения альфа-канала хранятся в верхних битах целочисленного типа uint.

В зависимости от контекста 16-ричные цифры могут записываться с префиксом '0x' или '#', например, 80FFFF00, или 0x80FFFF00, или #80FFFF00.

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- зададим прозрачность
uchar alfa=0x55; // значение 0x55 означает 55/255=21.6 % прозрачности
//--- выведем преобразование в ARGB для цвета clrBlue
PrintFormat("0x%.8X - clrBlue",clrBlue);
PrintFormat("0x%.8X - clrBlue ARGB with alfa=0x55 (transparency 21.6%%)",ColorToARGB(clrBlue,alfa));
//--- выведем преобразование в ARGB для цвета clrGreen
PrintFormat("0x%.8X - clrGreen",clrGreen);
PrintFormat("0x%.8X - clrGreen ARGB with alfa=0x55 (transparency 21.6%%)",ColorToARGB(clrGreen,alfa));
//--- выведем преобразование в ARGB для цвета clrRed
PrintFormat("0x%.8X - clrRed",clrRed);
PrintFormat("0x%.8X - clrRed ARGB with alfa=0x55 (transparency 21.6%%)",ColorToARGB(clrRed,alfa));
}

Смотри также

Ресурсы, ResourceCreate(), TextOut(), Тип color, Типы char, short, int и long


ColorToString

Справочник MQL4 / Преобразование данных / ColorToString

ColorToString

Преобразует значение цвета в строку вида "R,G,B".

string ColorToString(
color color_value, // значение цвета
bool color_name // выводить имя цвета или нет
);

Параметры

color_value

[in] Значение цвета в переменной типа color.

color_name

[in] Признак необходимости возвращать имя цвета, в случае, если значение цвета совпадает с одной из предопределенных цветовых констант.

Возвращаемое значение

Строковое представление цвета в виде "R,G,B", где R, G и B представляют собой преобразованные в строку десятичные константы со значением от 0 до 255. Если задан параметр color_name=true, то производится попытка преобразовать значение цвета к имени цвета.

Пример:

string clr=ColorToString(C'0,255,0'); // зеленый цвет
Print(clr);

clr=ColorToString(C'0,255,0',true); // получить цветовую константу
Print(clr);


DoubleToString

Справочник MQL4 / Преобразование данных / DoubleToString

DoubleToString

Преобразование числового значения в текстовую строку.

string DoubleToString(
double value, // число
int digits=8 // кол-во знаков после запятой
);

Параметры

value

[in] Величина с плавающей точкой.

digits

[in] Формат точности. Если значение digits лежит в диапазоне от 0 до 16, то будет получено строковое представление числа с указанным количество знаков после запятой. Если значение digits лежит в диапазоне от -1 до -16, то будет получено строковое представление числа в научном формате с указанным количеством знаков после запятой. Во всех остальных случаях строковое представление числа будет содержать 8 знаков после запятой.

Возвращаемое значение

Строка, содержащая символьное представление числа в указанном формате точности.

Пример:

Print("DoubleToString(120.0+M_PI) : ",DoubleToString(120.0+M_PI));
Print("DoubleToString(120.0+M_PI,16) : ",DoubleToString(120.0+M_PI,16));
Print("DoubleToString(120.0+M_PI,-16) : ",DoubleToString(120.0+M_PI,-16));
Print("DoubleToString(120.0+M_PI,-1) : ",DoubleToString(120.0+M_PI,-1));
Print("DoubleToString(120.0+M_PI,-20) : ",DoubleToString(120.0+M_PI,-20));

Смотри также

NormalizeDouble, StringToDouble


EnumToString

Справочник MQL4 / Преобразование данных / EnumToString

EnumToString

Преобразование значения перечисления любого типа в текстовое представление.

string EnumToString(
any_enum value // значение из перечисления любого типа
);

Параметры

value

[in] Значение перечисления любого типа.

Возвращаемое значение

Строка, содержащая текстовое представление значения. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Функция может установить в переменной _LastError следующие значения ошибок:

  • ERR_INTERNAL_ERROR – ошибка среды выполнения
  • ERR_NOT_ENOUGH_MEMORY – недостаточно памяти для завершения операции
  • ERR_INVALID_PARAMETER – невозможно разрешить имя значения перечисления

Пример:

enum interval // перечисление именованных констант
{
month=1, // интервал в один месяц
two_months, // два месяца
quarter, // три месяца - квартал
halfyear=6, // полугодие
year=12, // год - 12 месяцев
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- установим временной интервал равным месяцу
interval period=month;
Print(EnumToString(period)+"="+IntegerToString(period));

//--- установим временной интервал равным кварталу (три месяца)
period=quarter;
Print(EnumToString(period)+"="+IntegerToString(period));

//--- установим временной интервал равным году (12 месяцев)
period=year;
Print(EnumToString(period)+"="+IntegerToString(period));

//--- проверим как выводится тип ордера
ENUM_ORDER_TYPE type=ORDER_TYPE_BUY;
Print(EnumToString(type)+"="+IntegerToString(type));

//--- проверим как выводится неверное значение
type=WRONG_VALUE;
Print(EnumToString(type)+"="+IntegerToString(type));

// Результат выполнения:
// month=1
// quarter=3
// year=12
// ORDER_TYPE_BUY=0
// ENUM_ORDER_TYPE::-1=-1
}

Смотри также

Перечисления, Input переменные


IntegerToString

Справочник MQL4 / Преобразование данных / IntegerToString

IntegerToString

Преобразует значение целого типа в строку указанной длины и возвращает полученную строку.

string IntegerToString(
long number, // число
int str_len=0, // длина строки на выходе
ushort fill_symbol=' ' // заполнитель
);

Параметры

number

[in] Число для преобразования.

str_len=0

[in] Длина строки. Если длина полученной строки окажется больше указанной, то строка не усекается. Если длина полученной строки окажется меньше, то полученная строка будет дополнена слева символом-заполнителем.

fill_symbol=' '

[in] Символ-заполнитель. По умолчанию – пробел.

Возвращаемое значение

Строка.


ShortToString

Справочник MQL4 / Преобразование данных / ShortToString

ShortToString

Преобразует код символа (unicode) в односимвольную строку и возвращает полученную строку.

string ShortToString(
ushort symbol_code // символ
);

Параметры

symbol_code

[in] Код символа. Вместо кода символа можно использовать литеральную строку, содержащую символ, либо литеральную строку с двухбайтовым шестнадцатиричным кодом, соответствующему символу из таблицы Unicode.

Возвращаемое значение

Строка.


ShortArrayToString

Справочник MQL4 / Преобразование данных / ShortArrayToString

ShortArrayToString

Копирует часть массива в возвращаемую строку.

string ShortArrayToString(
ushort array[], // массив
int start=0, // начальная позиция в массиве
int count=-1 // количество символов
);

Параметры

array[]

[in] Массив типа ushort (аналог типа wchar_t).

start=0

[in] Позиция, с которой начинается копирование. По умолчанию 0.

count=-1

[in] Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0.

Возвращаемое значение

Строка.


TimeToString

Справочник MQL4 / Преобразование данных / TimeToString

TimeToString

Преобразование значения, содержащего время в секундах, прошедшее с 01.01.1970, в строку формата "yyyy.mm.dd hh:mi".

string TimeToString(
datetime value, // число
int mode=TIME_DATE|TIME_MINUTES // формат вывода
);

Параметры

value

[in] Время в секундах от 00:00 1 января 1970.

mode=TIME_DATE|TIME_MINUTES

[in] Дополнительный режим вывода данных. Может быть одним или комбинированным флагом:
TIME_DATE получает результат в форме " yyyy.mm.dd " ,
TIME_MINUTES получает результат в форме " hh:mi " ,
TIME_SECONDS получает результат в форме " hh:mi:ss ".

Возвращаемое значение

Строка.


NormalizeDouble

Справочник MQL4 / Преобразование данных / NormalizeDouble

NormalizeDouble

Округление числа с плавающей точкой до указанной точности.

double NormalizeDouble(
double value, // нормализуемое число
int digits // кол-во знаков после запятой
);

Параметры

value

[in] Величина с плавающей точкой.

digits

[in] Формат точности, число цифр после десятичной точки (0-8).

Возвращаемое значение

Значение типа double с заданной точностью.

Примечание

Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров, должны быть нормализованы с точностью, значение которой можно получить функцией Digits().

Нужно иметь в виду, что нормализованное число при выводе в Журнал с помощью Print() может содержать большее количество знаков после запятой, чем вы ожидаете. Например,

double a=76.671; // нормализованное число с 3 знаками после запятой
Print("Print(76.671)=",a); // выведем его как есть
Print("DoubleToString(a,8)=",DoubleToString(a,8)); // выведем с заданной точностью

выдаст в терминале:

DoubleToString(a,8)=76.67100000

Print(76.671)=76.67100000000001

Пример:

double pi=M_PI;
Print("pi=",DoubleToString(pi,16));

double pi_3=NormalizeDouble(M_PI,3);
Print("NormalizeDouble(pi,3) = ",DoubleToString(pi_3,16))
;
double pi_8=NormalizeDouble(M_PI,8);
Print("NormalizeDouble(pi,8) = ",DoubleToString(pi_8,16));

double pi_0=NormalizeDouble(M_PI,0);
Print("NormalizeDouble(pi,0) = ",DoubleToString(pi_0,16));
/*
Результат:
pi= 3.1415926535897931
NormalizeDouble(pi,3)= 3.1419999999999999
NormalizeDouble(pi,8)= 3.1415926499999998
NormalizeDouble(pi,0)= 3.0000000000000000
*/

Смотри также

DoubleToString, Вещественные типы (double, float), Приведение типов,


StringToCharArray

Справочник MQL4 / Преобразование данных / StringToCharArray

StringToCharArray

Посимвольно копирует преобразованную из unicode в ansi строку в указанное место массива типа uchar. Функция возвращает количество скопированных элементов.

int StringToCharArray(
string text_string, // строка-источник
uchar& array[], // массив
int start=0, // начальная позиция в массиве
int count=-1, // количество символов
uint codepage=CP_ACP // кодовая страница
);

Параметры

text_string

[in] Строка для копирования.

array[]

[out] Массив типа uchar.

start=0

[in] Позиция, с которой начинается копирование. По умолчанию 0.

count=-1

[in] Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи символа '\0', завершающего строку. Символ '\0' также будет скопирован в массив-приемник, при этом размер динамического массива может быть увеличен при необходимости под размер строки. Если размер динамического массива больше длины строки, то размер массива уменьшен не будет.

codepage=CP_ACP

[in] Значение кодовой страницы. Для наиболее употребимых кодовых страниц предусмотрены соответствующие константы.

Возвращаемое значение

Количество скопированных элементов.

Примечание

При копировании функция StringToCharArray() также копирует символ '\0', завершающий строку. Для его исключения нужно явно указывать длину строки:

//--- пример копирования строки str в массив array[]
StringToCharArray(str,array,0,StringLen(str));

Смотри также

Использование кодовой страницы


StringToColor

Справочник MQL4 / Преобразование данных / StringToColor

StringToColor

Преобразует строку типа "R,G,B" или строку, содержащую наименование цвета, в значение типа color.

color StringToColor(
string color_string // строковое представление цвета
);

Параметры

color_string

[in] Строковое представление цвета типа "R,G,B" или название одного из предопределенных Web-цветов.

Возвращаемое значение

Значение цвета.

Пример:

color str_color=StringToColor("0,127,0");
Print(str_color);
Print((string)str_color);
//--- немного изменим цвет
str_color=StringToColor("0,128,0");
Print(str_color);
Print((string)str_color);


StringToDouble

Справочник MQL4 / Преобразование данных / StringToDouble

StringToDouble

Преобразование строки, содержащей символьное представление числа, в число типа double.

double StringToDouble(
string value // строка
);

Параметры

value

[in] Строка, содержащая символьное представление числа.

Возвращаемое значение

Значение типа double.


StringToInteger

Справочник MQL4 / Преобразование данных / StringToInteger

StringToInteger

Преобразование строки, содержащей символьное представление числа, в число типа int (целое).

long StringToInteger(
string value // строка
);

Параметры

value

[in] Строка, содержащая число.

Возвращаемое значение

Значение типа long.


StringToShortArray

Справочник MQL4 / Преобразование данных / StringToShortArray

StringToShortArray

Посимвольно копирует строку в указанное место массива типа ushort. Функция возвращает количество скопированных элементов.

int StringToShortArray(
string text_string, // строка-источник
ushort& array[], // массив
int start=0, // начальная позиция в массиве
int count=-1 // количество символов
);

Параметры

text_string

[in] Строка для копирования.

array[]

[out] Массив типа ushort (аналог типа wchar_t).

start=0

[in] Позиция, с которой начинается копирование. По умолчанию 0.

count=-1

[in] Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0. Терминальный 0 также будет скопирован в массив-приемник, при этом размер динамического массива может быть увеличен при необходимости под размер строки. Если размер динамического массива больше длины строки, то размер массива уменьшен не будет.

Возвращаемое значение

Количество скопированных элементов.


StringToTime

Справочник MQL4 / Преобразование данных / StringToTime

StringToTime

Преобразование строки, содержащей время и/или дату в формате "yyyy.mm.dd [hh:mi]", в число типа datetime.

datetime StringToTime(
string value // строка-дата
);

Параметры

value

[in] Строка в формате " yyyy.mm.dd hh:mi ".

Возвращаемое значение

Значение типа datetime, содержащее количество секунд, прошедших с 01.01.1970.

Примечание

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


StringFormat

Справочник MQL4 / Преобразование данных / StringFormat

StringFormat

Форматирует полученные параметры и возвращает строку.

string StringFormat(
string format, // строка с описанием формата
... ... // параметры
);

Параметры

format

[in] Строка, содержащая способ форматирования. Правила форматирования такие же, как и для функции PrintFormat

...

[in] Параметры, разделенные запятой.

Возвращаемое значение

Строка.

Пример:

void OnStart()
{
//--- строковые переменные
string output_string;
string temp_string;
string format_string;
//--- подготовим заголовок спецификации
temp_string=StringFormat("Спецификация контракта для %s:\r\n",_Symbol);
StringAdd(output_string,temp_string);
//--- вывод значения int
int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
temp_string=StringFormat(" SYMBOL_DIGITS = %d (количество знаков после запятой)\r\n",
digits);
StringAdd(output_string,temp_string);
//--- вывод значения double с переменным количеством цифр после десятичной точки
double point_value=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
format_string=StringFormat(" SYMBOL_POINT = %%.%df (значение одного пункта)\r\n",
digits);
temp_string=StringFormat(format_string,point_value);
StringAdd(output_string,temp_string);
//--- вывод значения int
int spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
temp_string=StringFormat(" SYMBOL_SPREAD = %d (текущий спред в пунктах)\r\n",
spread);
StringAdd(output_string,temp_string);
//--- вывод значения int
int min_stop=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
temp_string=StringFormat(" SYMBOL_TRADE_STOPS_LEVEL = %d (минимальный отступ в пунктах для стоп-ордеров)\r\n",
min_stop);
StringAdd(output_string,temp_string);
//--- вывод значения double без дробной части
double contract_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
temp_string=StringFormat(" SYMBOL_TRADE_CONTRACT_SIZE = %.f (размер контракта)\r\n",
contract_size);
StringAdd(output_string,temp_string);
//--- вывод значения double с точностью по умолчанию
double tick_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
temp_string=StringFormat(" SYMBOL_TRADE_TICK_SIZE = %f (минимальное изменение цены)\r\n",
tick_size);
StringAdd(output_string,temp_string);
//--- определение способа начисления свопов
int swap_mode=(int)SymbolInfoInteger(_Symbol,SYMBOL_SWAP_MODE);
string str_swap_mode;
switch(swap_mode)
{
case 0: str_swap_mode="0 (в пунктах)"; break;
case 1: str_swap_mode="1 (в базовой валюте инструмента)"; break;
case 2: str_swap_mode="2 (в процентах)"; break;
case 3: str_swap_mode="3 (в валюте залоговых средств)"; break;
}
//--- вывод значения string
temp_string=StringFormat(" SYMBOL_SWAP_MODE = %s\r\n",
str_swap_mode);
StringAdd(output_string,temp_string);
//--- вывод значения double с точностью по умолчанию
double swap_long=SymbolInfoDouble(_Symbol,SYMBOL_SWAP_LONG);
temp_string=StringFormat(" SYMBOL_SWAP_LONG = %f (своп на покупку)\r\n",
swap_long);
StringAdd(output_string,temp_string);
//--- вывод значения double с точностью по умолчанию
double swap_short=SymbolInfoDouble(_Symbol,SYMBOL_SWAP_SHORT);
temp_string=StringFormat(" SYMBOL_SWAP_SHORT = %f (своп на продажу)\r\n",
swap_short);
StringAdd(output_string,temp_string);
//--- определение режима торговли
int trade_mode=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_MODE);
string str_trade_mode;
switch(trade_mode)
{
case SYMBOL_TRADE_MODE_DISABLED: str_trade_mode="SYMBOL_TRADE_MODE_DISABLED (торговля по символу запрещена)"; break;
case SYMBOL_TRADE_MODE_LONGONLY: str_trade_mode="SYMBOL_TRADE_MODE_LONGONLY (разрешены только покупки)"; break;
case SYMBOL_TRADE_MODE_SHORTONLY: str_trade_mode="SYMBOL_TRADE_MODE_SHORTONLY (разрешены только продажи)"; break;
case SYMBOL_TRADE_MODE_CLOSEONLY: str_trade_mode="SYMBOL_TRADE_MODE_CLOSEONLY (разрешены только операции закрытия ордеров)"; break;
case SYMBOL_TRADE_MODE_FULL: str_trade_mode="SYMBOL_TRADE_MODE_FULL (нет ограничений на торговые операции)"; break;
}
//--- вывод значения string
temp_string=StringFormat(" SYMBOL_TRADE_MODE = %s\r\n",
str_trade_mode);
StringAdd(output_string,temp_string);
//--- вывод значения double в компактном виде
double volume_min=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
temp_string=StringFormat(" SYMBOL_VOLUME_MIN = %g (минимальный объем сделки)\r\n",volume_min);
StringAdd(output_string,temp_string);
//--- вывод значения double в компактном виде
double volume_step=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
temp_string=StringFormat(" SYMBOL_VOLUME_STEP = %g (минимальный шаг изменения объема сделки)\r\n",volume_step);
StringAdd(output_string,temp_string);
//--- вывод значения double в компактном виде
double volume_max=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
temp_string=StringFormat(" SYMBOL_VOLUME_MAX = %g (максимальный объем сделки)\r\n",volume_max);
StringAdd(output_string,temp_string);
//--- определение способа вычисления величины залоговых средств
int calc_mode=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_CALC_MODE);
string str_calc_mode;
switch(calc_mode)
{
case 0:str_calc_mode="0 (Forex)";break;
case 1:str_calc_mode="1 (CFD)";break;
case 2:str_calc_mode="2 (фьючерсы)";break;
case 3:str_calc_mode="3 (CFD на индексы)";break;
}
//--- вывод значения string
temp_string=StringFormat(" SYMBOL_TRADE_CALC_MODE = %s\r\n",
str_calc_mode);
StringAdd(output_string,temp_string);
//--- вывод значения double с 2 цифрами после десятичной точки
double margin_initial=SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL);
temp_string=StringFormat(" SYMBOL_MARGIN_INITIAL = %.2f (начальная маржа)\r\n",
margin_initial);
StringAdd(output_string,temp_string);
//--- вывод значения double с 2 цифрами после десятичной точки
double margin_maintenance=SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_MAINTENANCE);
temp_string=StringFormat(" SYMBOL_MARGIN_MAINTENANCE = %.2f (поддерживающая маржа)\r\n",
margin_maintenance);
StringAdd(output_string,temp_string);
//--- вывод значения int
int freeze_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL);
temp_string=StringFormat(" SYMBOL_TRADE_FREEZE_LEVEL = %d (дистанция заморозки операций в пунктах)",
freeze_level);
StringAdd(output_string,temp_string);
Print(output_string);
Comment(output_string);
/* результат выполнения
Спецификация контракта для EURJPY:
SYMBOL_DIGITS = 3 (количество знаков после запятой)
SYMBOL_POINT = 0.001 (значение одного пункта)
SYMBOL_SPREAD = 23 (текущий спред в пунктах)
SYMBOL_TRADE_STOPS_LEVEL = 100 (минимальный отступ в пунктах для стоп-ордеров)
SYMBOL_TRADE_CONTRACT_SIZE = 100000 (размер контракта)
SYMBOL_TRADE_TICK_SIZE = 0.001000 (минимальное изменение цены)
SYMBOL_SWAP_MODE = 0 (в пунктах)
SYMBOL_SWAP_LONG = -1.600000 (своп на покупку)
SYMBOL_SWAP_SHORT = -1.100000 (своп на продажу)
SYMBOL_TRADE_MODE = SYMBOL_TRADE_MODE_FULL (нет ограничений на торговые операции)
SYMBOL_VOLUME_MIN = 0.01 (минимальный объем сделки)
SYMBOL_VOLUME_STEP = 0.01 (минимальный шаг изменения объема сделки)
SYMBOL_VOLUME_MAX = 1000 (максимальный объем сделки)
SYMBOL_TRADE_CALC_MODE = 0 (Forex)
SYMBOL_MARGIN_INITIAL = 0.00 (начальная маржа)
SYMBOL_MARGIN_MAINTENANCE = 0.00 (поддерживающая маржа)
SYMBOL_TRADE_FREEZE_LEVEL = 20 (дистанция заморозки операций в пунктах)
*/
}

Смотри также

PrintFormat, DoubleToString,ColorToString, TimeToString


CharToStr

Справочник MQL4 / Преобразование данных / CharToStr

CharToStr

Преобразует код символа в односимвольную строку.

string CharToStr(
uchar char_code // ASCII-код символа
);

Параметры

char_code

[in] ASCII-код символа.

Возвращаемое значение

Строка.

Пример:

string str="WORL"+CharToStr(68); // 68 - код для 'D'
// результирующая строка будет WORLD

Смотри также

PrintFormat, DoubleToString, ColorToString, TimeToString


DoubleToStr

Справочник MQL4 / Преобразование данных / DoubleToStr

DoubleToStr

Преобразует числовое значение в текстовую строку, содержащую символьное представление числа в указанном формате точности.

string DoubleToStr(
double value, // величина
int digits // формат точности
);

Параметры

value

[in] Величина с плавающей точкой.

digits

[in] Формат точности, число цифр после десятичной точки (0-8).

Возвращаемое значение

Строка.

Пример:

string value=DoubleToStr(1.28473418, 5);
// содержимое строки value - "1.28473"

Смотри также

PrintFormat, StrToDouble, DoubleToString


StrToDouble

Справочник MQL4 / Преобразование данных / StrToDouble

StrToDouble

Преобразует строку, содержащую символьное представление числа, в число типа double (формат двойной точности с плавающей точкой).

double StrToDouble(
string value // строка
);

Параметры

value

[in] Строка, содержащая символьное представление числа.

Возвращаемое значение

Значение типа double.

Пример:

double var=StrToDouble("103.2812");

Смотри также

PrintFormat, DoubleToStr, DoubleToString


StrToInteger

Справочник MQL4 / Преобразование данных / StrToInteger

StrToInteger

Преобразует строку, содержащую символьное представление числа, в число типа int (целое).

int StrToInteger(
string value // строка
);

Параметры

value

[in] Строка, содержащая число.

Возвращаемое значение

Значение типа int.

Пример:

int var1=StrToInteger("1024");

Смотри также

PrintFormat, StringToInteger, IntegerToString


StrToTime

Справочник MQL4 / Преобразование данных / StrToTime

StrToTime

Преобразует строку, содержащую время и/или дату в формате "yyyy.mm.dd [hh:mi]", в число типа datetime (количество секунд, прошедших с 01.01.1970).

datetime StrToTime(
string value // строка-дата
);

Параметры

value

[in] Строка в формате "yyyy.mm.dd hh:mi ".

Возвращаемое значение

Значение типа datetime, содержащее количество секунд, прошедших с 01.01.1970.

Пример:

datetime var1,var2,var3;
var1=StrToTime("2003.8.12 17:35");
var2=StrToTime("17:35"); // возврат текущей даты с указанным временем
var3=StrToTime("2003.8.12"); // возврат даты с полуночным временем "00:00"

Смотри также

PrintFormat, TimeToStr, TimeToString


TimeToStr

Справочник MQL4 / Преобразование данных / TimeToStr

TimeToStr

Преобразует значение, содержащее время в секундах, прошедшее с 01.01.1970, в строку формата "yyyy.mm.dd hh:mi".

string TimeToStr(
datetime value, // число
int mode=TIME_DATE|TIME_MINUTES // формат вывода
);

Параметры

value

[in] Время в секундах от 00:00 1 января 1970.

mode=TIME_DATE|TIME_MINUTES

[in] Дополнительный режим вывода данных. Может быть одним или комбинированным флагом:
TIME_DATE получает результат в форме " yyyy.mm.dd " ,
TIME_MINUTES получает результат в форме " hh:mm " ,
TIME_SECONDS получает результат в форме " hh:mm:ss ".

Возвращаемое значение

Строка.

Пример:

string var1=TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);

Смотри также

PrintFormat, StrToTime, StringToTime


Математические функции

Справочник MQL4 / Математические функции

Математические функции

Набор математических и тригонометрических функций.

Функция | Действие
MathAbs | Возвращает абсолютное значение (значение по модулю) переданного ей числа
MathArccos | Возвращает значение арккосинуса x в радианах
MathArcsin | Возвращает значение арксинуса x в радианах
MathArctan | Возвращает арктангенс x в радианах
MathCeil | Возвращает ближайшее сверху целое числовое значение
MathCos | Возвращает косинус числа
MathExp | Возвращает экспоненту числа
MathFloor | Возвращает ближайшее снизу целое числовое значение
MathLog | Возвращает натуральный логарифм
MathLog10 | Возвращает логарифм числа по основанию 10
MathMax | Возвращает максимальное из двух числовых значений
MathMin | Возвращает минимальное из двух числовых значений
MathMod | Возвращает вещественный остаток от деления двух чисел
MathPow | Возводит основание в указанную степень
MathRand | Возвращает псевдослучайное целое число в диапазоне от 0 до 32767
MathRound | Округляет число до ближайшего целого
MathSin | Возвращает синус числа
MathSqrt | Возвращает квадратный корень
MathSrand | Устанавливает начальное состояние генератора псевдослучайных целых чисел
MathTan | Возвращает тангенс числа
MathIsValidNumber | Проверяет корректность действительного числа

Что нового в MQL5

Добавлены гиперболические тригонометрическиe функции и функция MathSwap, которая меняет порядок байтов в целочисленных типах ushort, uint и ulong. Необходимость в таком преобразовании часто возникает при работе с Сетевыми функциями.

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


MathAbs

Справочник MQL4 / Математические функции / MathAbs

MathAbs

Возвращает абсолютное значение (значение по модулю) переданного ей числа.

double MathAbs(
double value // число
);

Параметры

value

[in] Числовая величина.

Возвращаемое значение

Значение типа double, больше или равно нулю.

Примечание

Вместо функции MathAbs() можно использовать функцию fabs().


MathArccos

Справочник MQL4 / Математические функции / MathArccos

MathArccos

Возвращает значение арккосинуса x в диапазоне 0 к π в радианах.

double MathArccos(
double val // -1<val<1
);

Параметры

val

[in] Значение val между -1 и 1, арккосинус которого должен быть вычислен.

Возвращаемое значение

Арккосинус числа в радианах. Если val меньше -1 или больше 1, функция возвращает NaN (неопределенное значение).

Примечание

Вместо функции MathArccos() можно использовать функцию acos().

Смотри также

Вещественные типы (double, float)


MathArcsin

Справочник MQL4 / Математические функции / MathArcsin

MathArcsin

Возвращает арксинус x в диапазоне от -π/2 до π/2 радианов.

double MathArcsin(
double val // -1<value<1
);

Параметры

val

[in] Значение val между -1 и 1, арксинус которого должен быть вычислен.

Возвращаемое значение

Арксинус числа val в радианах в диапазоне от -π/2 до π/2 радианов. Если val меньше -1 или больше 1, функция возвращает NaN (неопределенное значение).

Примечание

Вместо функции MathArcsin() можно использовать функцию asin().

Смотри также

Вещественные типы (double, float)


MathArctan

Справочник MQL4 / Математические функции / MathArctan

MathArctan

Возвращает арктангенс x. Если x равен 0, функция возвращает 0.

double MathArctan(
double value // тангенс
);

Параметры

value

[in] Число, представляющее тангенс.

Возвращаемое значение

MathArctan возвращает значение в диапазоне от -π/2 до π/2 радианов.

Примечание

Вместо функции MathArctan() можно использовать функцию atan().


MathCeil

Справочник MQL4 / Математические функции / MathCeil

MathCeil

Возвращает ближайшее сверху целое числовое значение.

double MathCeil(
double val // число
);

Параметры

val

[in] Числовая величина.

Возвращаемое значение

Числовое значение, представляющую наименьшее целое число, которое больше или равно val.

Примечание

Вместо функции MathCeil() можно использовать функцию ceil().


MathCos

Справочник MQL4 / Математические функции / MathCos

MathCos

Функция возвращает косинус угла.

double MathCos(
double value // число
);

Параметры

value

[in] Угол в радианах.

Возвращаемое значение

Значение типа double в диапазоне от -1 до 1.

Примечание

Вместо функции MathCos() можно использовать функцию cos().


MathExp

Справочник MQL4 / Математические функции / MathExp

MathExp

Возвращает значение числа e в степени d.

double MathExp(
double value // степень для числа e
);

Параметры

value

[in] Число, определяющее степень.

Возвращаемое значение

Число типа double. При переполнении функция возвращает INF (бесконечность), в случае потери порядка точности MathExp возвращает 0.

Примечание

Вместо функции MathExp() можно использовать функцию exp().

Смотри также

Вещественные типы (double, float)


MathFloor

Справочник MQL4 / Математические функции / MathFloor

MathFloor

Возвращает ближайшее снизу целое числовое значение.

double MathFloor(
double val // число
);

Параметры

val

[in] Числовое значение.

Возвращаемое значение

Числовое значение, представляющее наибольшее целое число, которое меньше или равно val.

Примечание

Вместо функции MathFloor() можно использовать функцию floor().


MathLog

Справочник MQL4 / Математические функции / MathLog

MathLog

Возвращает натуральный логарифм.

double MathLog(
double val // число для взятия логарифма
);

Параметры

val

[in] Значение, логарифм которого должен быть вычислен.

Возвращаемое значение

Натуральный логарифм val в случае успеха. Если значение val отрицательно, функция возвращает NaN (неопределенное значение). Если val равно 0, функция возвращает INF (бесконечность) .

Примечание

Вместо функции MathLog() можно использовать функцию log().

Смотри также

Вещественные типы (double, float)


MathLog10

Справочник MQL4 / Математические функции / MathLog10

MathLog

Возвращает логарифм числа по основанию 10.

double MathLog10(
double val // число для взятия логарифма
);

Параметры

val

[in] Значение, десятичный логарифм которого должен быть вычислен.

Возвращаемое значение

Десятичный логарифм val в случае успеха. Если значение val отрицательно, функция возвращает NaN (неопределенное значение). Если val равно 0, функция возвращает INF (бесконечность) .

Примечание

Вместо функции MathLog10() можно использовать функцию log10().

Смотри также

Вещественные типы (double, float)


MathMax

Справочник MQL4 / Математические функции / MathMax

MathMax

Функция возвращает максимальное из двух числовых значений.

double MathMax(
double value1, // первое число
double value2 // второе число
);

Параметры

value1

[in] Первое числовое значение.

value2

[in] Второе числовое значение.

Возвращаемое значение

Большее из двух чисел.

Примечание

Вместо функции MathMax() можно использовать функцию fmax(). Функции fmax(), fmin(), MathMax(), MathMin() могут работать с целыми типами без преобразования к типу double.

Если в функцию передаются параметры разных типов, то параметр младшего типа автоматически приводится к старшему типу. Тип возвращаемого значения соответствует старшему типу.

Если передаются данные одного типа, то никакого преобразования не производится.


MathMin

Справочник MQL4 / Математические функции / MathMin

MathMin

Функция возвращает минимальное из двух числовых значений.

double MathMin(
double value1, // первое число
double value2 // второе число
);

Параметры

value1

[in] Первое числовое значение.

value2

[in] Второе числовое значение.

Возвращаемое значение

Меньшее из двух чисел.

Примечание

Вместо функции MathMin() можно использовать функцию fmin(). Функции fmax(), fmin(), MathMax(), MathMin() могут работать с целыми типами без преобразования к типу double.

Если в функцию передаются параметры разных типов, то параметр младшего типа автоматически приводится к старшему типу. Тип возвращаемого значения соответствует старшему типу.

Если передаются данные одного типа, то никакого преобразования не производится.


MathMod

Справочник MQL4 / Математические функции / MathMod

MathMod

Возвращает вещественный остаток от деления двух чисел.

double MathMod(
double value, // делимое
double value2 // делитель
);

Параметры

value

[in] Значение делимого.

value2

[in] Значение делителя.

Возвращаемое значение

Функция MathMod рассчитывает вещественный остаток f от val / y таким образом, что val = i * y + f , где i является целым числом, f имеет тот же знак, что и val, и абсолютное значение f меньше, чем абсолютное значение y.

Примечание

Вместо функции MathMod() можно использовать функцию fmod().


MathPow

Справочник MQL4 / Математические функции / MathPow

MathPow

Возводит основание в указанную степень.

double MathPow(
double base, // основание
double exponent // показатель степени
);

Параметры

base

[in] Основание.

exponent

[in] Значение степени.

Возвращаемое значение

Значение основания, возведенного в указанную степень.

Примечание

Вместо функции MathPow() можно использовать функцию pow().


MathRand

Справочник MQL4 / Математические функции / MathRand

MathRand

Возвращает псевдослучайное целое число в диапазоне от 0 до 32767.

int MathRand();

Возвращаемое значение

Целое число в диапазоне от 0 до 32767.

Примечание

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

Примечание

Вместо функции MathRand() можно использовать функцию rand().


MathRound

Справочник MQL4 / Математические функции / MathRound

MathRound

Возвращает значение, округленное до ближайшего целого числа указанного числового значения.

double MathRound(
double value // округляемое значение
);

Параметры

value

[in] Числовая величина для округления.

Возвращаемое значение

Значение, округленное до ближайшего целого числа.

Примечание

Вместо функции MathRound() можно использовать функцию round().


MathSin

Справочник MQL4 / Математические функции / MathSin

MathSin

Возвращает синус указанного угла.

double MathSin(
double value // аргумент в радианах
);

Параметры

value

[in] Угол в радианах.

Возвращаемое значение

Синус угла, указанного в радианах. Возвращает значение в диапазоне от -1 до 1.

Примечание

Вместо функции MathSin() можно использовать функцию sin().


MathSqrt

Справочник MQL4 / Математические функции / MathSqrt

MathSqrt

Возвращает квадратный корень числа.

double MathSqrt(
double value // положительное число
);

Параметры

value

[in] Положительная числовая величина.

Возвращаемое значение

Квадратный корень числа value. Если value отрицательно, MathSqrt возвращает NaN (неопределенное значение).

Примечание

Вместо функции MathSqrt() можно использовать функцию sqrt().

Смотри также

Вещественные типы (double, float)


MathSrand

Справочник MQL4 / Математические функции / MathSrand

MathSrand

Устанавливает начальное состояние для генерации ряда псевдослучайных целых чисел.

void MathSrand(
int seed // инициализирующее число
);

Параметры

seed

[in] Начальное число для ряда случайных чисел.

Возвращаемое значение

Нет возвращаемого значения.

Примечание

Функция MathRand() предназначена для генерации последовательности псевдослучайных чисел. Вызов MathSrand() с определенным инициализирующим числом позволяет получать всегда одну и ту же последовательность псевдослучайных чисел.

Для гарантированного получения неповторяющейся последовательности используйте вызов MathSrand(GetTickCount()), так как значение GetTickCount() увеличивается с момента запуска операционной системы и не повторяется в течение 49 дней, пока не переполнится встроенный счетчик миллисекунд. Использование MathSrand(TimeCurrent()) не подходит по той причине, что функция TimeCurrent() возвращает время прихода последнего тика, которое может не меняться долгое время, например, в выходные дни.

Инициализацию генератора псевдослучайных чисел с помощью MathSrand() для индикаторов и экспертов лучше всего делать в обработчике OnInit(), это избавит от последующих многократных перезапусков генератора в OnTick() и OnCalculate().

Вместо функции MathSrand() можно использовать функцию srand().

Пример:

#property description "Индикатор демонстрирует центральную предельную теорему, которая гласит:"
#property description "Сумма достаточно большого количества слабо зависимых случайных величин, "
#property description "имеющих примерно одинаковые масштабы (ни одно из слагаемых не доминирует,"
#property description "не вносит в сумму определяющего вклада), имеет распределение, близкое к нормальному."

#property indicator_separate_window
#property indicator_buffers 1
//--- свойства графического построения
#property indicator_label1 "Label"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrRoyalBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 5
//--- input переменная
input int sample_number=10;
//--- индикаторный буфер для отрисовки распределения
double LabelBuffer[];
//--- счетчик тиков
double ticks_counter;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- связывание массива и индикаторного буфера
SetIndexBuffer(0,LabelBuffer,INDICATOR_DATA);
//--- развернем индикаторный буфер из настоящего в прошлое
ArraySetAsSeries(LabelBuffer,true);
//--- инициализируем генератор случайных чисел
MathSrand(GetTickCount());
//--- инициализируем счетчик тиков
ticks_counter=0;
}
//+------------------------------------------------------------------+
//| 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[])
{
//--- при нулевом счетчике обнулим буфер индикатора
if(ticks_counter==0) ArrayInitialize(LabelBuffer,0);
//--- увеличим счетчик
ticks_counter++;
//--- нужно периодически сбрасывать счетчик тиков, чтобы оживлять распределение
if(ticks_counter>100)
{
Print("Обнулили значения индикатора, начнем заполнять ячейки снова");
ticks_counter=0;
}
//--- получим выборку случайных значений, как сумму трех чисел от 0 до 7
for(int i=0;i<sample_number;i++)
{
//--- вычисление индекса ячейки, куда выпадет случайное число как сумма трех других
int rand_index=0;
//--- получим три случайных числа от 0 до 7
for(int k=0;k<3;k++)
{
//--- остаток от деления на 7 вернет значение от 0 до 6
rand_index+=MathRand()%7;
}
//--- увеличим на единицу значение в ячейке с номером rand_index
LabelBuffer[rand_index]++;
}
//--- выход из обработчика OnCalculate()
return(rates_total);
}


MathTan

Справочник MQL4 / Математические функции / MathTan

MathTan

Возвращает тангенс числа.

double MathTan(
double rad // аргумент в радианах
);

Параметры

rad

[in] Угол в радианах.

Возвращаемое значение

Тангенс числа rad. Если rad больше или равен 263 или меньше или равен -263, то происходит потеря значения и функция возвращает неопределенное число.

Примечание

Вместо функции MathTan() можно использовать функцию tan().

Смотри также

Вещественные типы (double, float)


MathIsValidNumber

Справочник MQL4 / Математические функции / MathIsValidNumber

MathIsValidNumber

Проверяет корректность действительного числа

bool MathIsValidNumber(
double number // число для проверки
);

Параметры

number

[in] Проверяемое число.

Возвращаемое значение

Возвращает true, если проверяемое значение является допустимым вещественным числом. Если проверяемое значение является плюс или минус бесконечностью, либо "не числом" (NaN - not a number), функция возвращает false.

Пример:

double abnormal=MathArcsin(2.0);
if(!MathIsValidNumber(abnormal)) Print("Внимание! MathArcsin(2.0) = ",abnormal);

Смотри также

Вещественные типы (double, float)


Строковые функции

Справочник MQL4 / Строковые функции

Строковые функции

Группа функций, предназначенных для работы с данными типа string.

Функция | Действие
StringAdd | Присоединяет к концу строки по месту указанную подстроку
StringBufferLen | Возвращает размер буфера, распределенного для строки
StringCompare | Сравнивает две строки и возвращает 1, если первая строка больше второй; 0 - если строки равны; -1 (минус один) - если первая строка меньше второй
StringConcatenate | Формирует строку из переданных параметров
StringFill | Заполняет указанную строку по месту указанными символами
StringFind | Поиск подстроки в строке
StringGetCharacter | Возвращает значение символа, расположенного в указанной позиции строки
StringInit | Инициализирует строку указанными символами и обеспечивает указанный размер строки
StringLen | Возвращает число символов в строке
StringReplace | Заменяет в строке все найденные подстроки на заданную последовательность символов.
StringSetCharacter | Возвращает копию строки с измененным значением символа в указанной позиции
StringSplit | Получает из указанной строки подстроки по заданному разделителю и возвращает количество полученных подстрок
StringSubstr | Извлекает подстроку из текстовой строки, начинающейся c указанной позиции
StringToLower | Преобразует все символы указанной строки в строчные (маленькие) по месту
StringToUpper | Преобразует все символы указанной строки в прописные (большие) по месту
StringTrimLeft | Удаляет символы перевода каретки, пробелы и символы табуляции с начала строки
StringTrimRight | Удаляет символы перевода каретки, пробелы и символы табуляции в конце строки
StringGetChar | Возвращает значение символа, расположенного в указанной позиции строки
StringSetChar | Возвращает копию строки с измененным значением символа в указанной позиции


StringAdd

Справочник MQL4 / Строковые функции / StringAdd

StringAdd

Присоединяет к концу строки по месту указанную подстроку.

bool StringAdd(
string& string_var, // строка, к которой добавляем
string add_substring // добавляемая строка
);

Параметры

string_var

[in][out] Строка, которая будет дополнена.

add_substring

[in] Строка, которая будет добавлена в конец исходной строки.

Возвращаемое значение

В случае успешного выполнения возвращает true, иначе false. Для получения кода ошибки нужно вызвать функцию GetLastError().

Пример:

void OnStart()
{
//---
long length=10000000;
string a="a",b="b",c;
//--- первый способ
uint starttime=GetTickCount(),finishtime;
long i;
for(i=0;i<length;i++)
{
c=a+b;
}
finishtime=GetTickCount();
Print("time for 'c = a + b' = ",(finishtime-starttime)," milliseconds, i = ",i);

//--- второй способ
starttime=GetTickCount();
for(i=0;i<length;i++)
{
StringAdd(a,b);
}
finishtime=GetTickCount();
Print("time for 'StringAdd(a,b)' = ",(finishtime-starttime)," milliseconds, i = ",i);

//--- третий способ
starttime=GetTickCount();
a="a"; // заново инициализируем переменную a
for(i=0;i<length;i++)
{
c=StringConcatenate(a,b);
}
finishtime=GetTickCount();
Print("time for 'c=StringConcatenate(a,b)' = ",(finishtime-starttime)," milliseconds, i = ",i);
}

Смотри также

StringConcatenate()


StringBufferLen

Справочник MQL4 / Строковые функции / StringBufferLen

StringBufferLen

Возвращает размер буфера, распределенного для строки.

int StringBufferLen(
string string_var // строка
)

Параметры

string_var

[in] Строка.

Возвращаемое значение

Значение 0 означает, что строка – константная и содержимое буфера менять нельзя. -1 означает, что строка принадлежит клиентскому терминалу и изменение содержимого буфера может привести к неопределенным результатам.

Примечание

Минимальный размер буфера равен 16.

Пример:

void OnStart()
{
long length=1000;
string a="a",b="b";
//---
long i;
Print("before: StringBufferLen(a) = ",StringBufferLen(a),
" StringLen(a) = ",StringLen(a));
for(i=0;i<length;i++)
{
StringAdd(a,b);
}
Print("after: StringBufferLen(a) = ",StringBufferLen(a),
" StringLen(a) = +-",StringLen(a));
}

Смотри также

StringAdd(), StringInit(), StringLen(), StringFill()


StringCompare

Справочник MQL4 / Строковые функции / StringCompare

StringCompare

Сравнивает между собой две строки и возвращает результат сравнения в виде целого числа.

int StringCompare(
const string& string1, // первая сравниваемая строка
const string& string2, // вторая сравниваемая строка
bool case_sensitive=true // режим учета регистра букв при сравнении
);

Параметры

string1

[in] Первая строка.

string2

[in] Вторая строка.

case_sensitive=true

[in] Режим учета регистра букв. Если значения равно true, то "A">"a". Если значение равно false, то "A"="a". По умолчанию значение параметра равно true.

Возвращаемое значение

  • -1 (минус один), если string1<string2
  • 0 (ноль), если string1=string2
  • 1 (один), если string1>string2

Примечание

Строки сравниваются посимвольно, символы сравниваются в алфавитном порядке в соответствии с текущей кодовой страницей.

Пример:

void OnStart()
{
//--- что больше, яблоко или дом?
string s1="Apple";
string s2="home";

//--- сравним с учетом регистра
int result1=StringCompare(s1,s2);
if(result1>0) PrintFormat("Сравнение с учетом регистра: %s > %s",s1,s2);
else
{
if(result1<0)PrintFormat("Сравнение с учетом регистра: %s < %s",s1,s2);
else PrintFormat("Сравнение с учетом регистра: %s = %s",s1,s2);
}

//--- сравним без учета регистра
int result2=StringCompare(s1,s2,false);
if(result2>0) PrintFormat("Сравнение без учета регистра: %s > %s",s1,s2);
else
{
if(result2<0)PrintFormat("Сравнение без учета регистра: %s < %s",s1,s2);
else PrintFormat("Сравнение без учета регистра: %s = %s",s1,s2);
}
/* Результат:
Сравнение с учетом регистра: Apple < home
Сравнение без учета регистра: Apple < home
*/
}

Смотри также

Тип string, CharToString(), ShortToString(), StringToCharArray(), StringToShortArray(), StringGetCharacter(), Использование кодовой страницы


StringConcatenate

Справочник MQL4 / Строковые функции / StringConcatenate

StringConcatenate

Возвращает строку, сформированную в результате конкатенации преобразованных в тип string параметров.

string StringConcatenate(
void argument1, // первый параметр любого простого типа
void argument2, // второй параметр любого простого типа
... // следующий параметр любого простого типа
);

Параметры

argumentN

[in] Любые значения, разделенные запятыми. От 2 до 63 параметров любого простого типа.

Возвращаемое значение

Строка, сформированная в результате конкатенации преобразованных в тип string параметров. Параметры преобразуются в строки по тем же правилам, что и в функциях Print() и Comment().

Примечание

Параметры могут иметь любой тип. Количество параметров не может быть меньше 2 и не может превышать 64.

Пример:

string text;
text=StringConcatenate("Account free margin is ", AccountFreeMargin(), " Current time is ", TimeToStr(TimeCurrent()));
// text="Account free margin is " + AccountFreeMargin() + " Current time is " + TimeToStr(TimeCurrent())
Print(text);

Смотри также

StringAdd()


StringFill

Справочник MQL4 / Строковые функции / StringFill

StringFill

Заполняет указанную строку по месту указанными символами.

bool StringFill(
string& string_var, // строка для заполнения
ushort character // символ, которым будет заполнена строка
);

Параметры

string_var

[in][out] Строка, которая будет заполнена указанным символом.

character

[in] Символ, которым будет заполнена строка.

Возвращаемое значение

В случае успешного выполнения возвращает true, иначе false. Для получения кода ошибки нужно вызвать функцию GetLastError().

Примечание

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

Пример:

void OnStart()
{
string str;
StringInit(str,20,'_');
Print("str = ",str);
StringFill(str,0);
Print("str = ",str,": StringBufferLen(str) = ", StringBufferLen(str));
}
// Результат
// str = ____________________
// str = : StringBufferLen(str) = 20
//

Смотри также

StringBufferLen(), StringLen(), StringInit()


StringFind

Справочник MQL4 / Строковые функции / StringFind

StringFind

Поиск подстроки в строке.

int StringFind(
string string_value, // строка, в которой ищем
string match_substring, // что ищем
int start_pos=0 // с какой позиции начинать поиск
);

Параметры

string_value

[in] Строка, в которой производится поиск.

match_substring

[in] Искомая подстрока.

start_pos=0

[in] Позиция в строке, с которой должен быть начат поиск.

Возвращаемое значение

Возвращает номер позиции в строке, с которой начинается искомая подстрока, либо -1, если подстрока не найдена.


StringGetCharacter

Справочник MQL4 / Строковые функции / StringGetCharacter

StringGetCharacter

Возвращает значение символа, расположенного в указанной позиции строки.

ushort StringGetCharacter(
string string_value, // строка
int pos // позиция символа в строке
);

Параметры

string_value

[in] Строка.

pos

[in] Позиция символа в строке. Может быть от 0 до StringLen(text) -1.

Возвращаемое значение

Код символа либо 0 в случае какой-либо ошибки. Для получения кода ошибки нужно вызвать функцию GetLastError().


StringInit

Справочник MQL4 / Строковые функции / StringInit

StringInit

Инициализирует строку указанными символами и обеспечивает указанный размер строки.

bool StringInit(
string& string_var, // строка для инициализации
int new_len=0, // требуемая длина строки после инициализации
ushort character=0 // символ, которым будет заполнена строка
);

Параметры

string_var

[in][out] Строка, которая должна быть инициализирована или деинициализирована.

new_len=0

[in] Длина строки после инициализации. Если размер=0, то деинициализирует строку, то есть, буфер строки освобождается и адрес буфера обнуляется.

character=0

[in] Символ для заполнения строки.

Возвращаемое значение

В случае успешного выполнения возвращает true, иначе false. Для получения кода ошибки нужно вызвать функцию GetLastError().

Примечание

Если character=0 и размер new_len>0, то будет распределен буфер строки указанного размера и заполнен нулями. Размер строки будет равен нулю, так как весь буфер заполнен терминаторами строки.

Пример:

void OnStart()
{
//---
string str;
StringInit(str,200,0);
Print("str = ",str,": StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
}
/* Результат
str = : StringBufferLen(str) = 200 StringLen(str) = 0
*/

Смотри также

StringBufferLen(), StringLen()


StringLen

Справочник MQL4 / Строковые функции / StringLen

StringLen

Возвращает число символов в строке.

int StringLen(
string string_value // строка
);

Параметры

string_value

[in] Строка для вычисления длины.

Возвращаемое значение

Количество символов в строке без учета завершающего нуля.


StringReplace

Справочник MQL4 / Строковые функции / StringReplace

StringReplace

Заменяет в строке все найденные подстроки на заданную последовательность символов.

int StringReplace(
string& str, // строка, в которой будет осуществляться замена
const string find, // искомая подстрока
const string replacement // подстрока, которая будет вставлена в найденные места
);

Параметры

str

[in][out] Строка, в которой необходимо произвести замены.

find

[in] Искомая подстрока для замены.

replacement

[in] Подстрока, которая будет вставлена вместо найденной.

Возвращаемое значение

Количество произведенных замен в случае успеха, в случае ошибки -1. Для получения кода ошибки нужно вызвать функцию GetLastError().

Примечание

Если функция успешно отработала, но замены не произведены (не найдена заменяемая подстрока), то возвращается 0.

Причиной ошибки могут быть неверные параметры str или find (пустая или неинициализировання строка, см. StringInit() ). Кроме того, ошибка возникнет, если для завершения замен недостаточно памяти.

Пример:

string text="The quick brown fox jumped over the lazy dog.";
int replaced=StringReplace(text,"quick","slow");
replaced+=StringReplace(text,"brown","black");
replaced+=StringReplace(text,"fox","bear");
Print("Replaced: ", replaced,". Result=",text);

// Результат
// Replaced: 3. Result=The slow black bear jumped over the lazy dog.
//

Смотри также

StringSetCharacter(), StringSubstr()


StringSetCharacter

Справочник MQL4 / Строковые функции / StringSetCharacter

StringSetCharacter

Возвращает true при успешной вставке символа в переданную строку.

bool StringSetCharacter(
string& string_var, // строка
int pos, // позиция
ushort character // символ
);

Параметры

string_var

[in][out] Строка.

pos

[in] Позиция символа в строке. Может быть от 0 до StringLen(text).

character

[in] Символьный код Unicode.

Возвращаемое значение

В случае успешного выполнения возвращает true, иначе false.

Примечание

Если значение pos меньше длины строки и значение символьного кода = 0, то строка усекается (но размер буфера, распределённого под строку остаётся неизменным). Длина строки становится равной значению pos.

Если значение параметра pos равняется значению длины строки, то указанный символ добавляется в конец строки, и таким образом длина строки увеличивается на единицу.

Пример:

void OnStart()
{
string str="0123456789";
Print("before: str = ",str,",StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
//--- вставим нулевое значение посреди строки
StringSetCharacter(str,6,0);
Print(" after: str = ",str,",StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
//--- добавим символ в конец строки
int size=StringLen(str);
StringSetCharacter(str,size,'+');
Print("addition: str = ",str,",StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) =",StringLen(str));
}
/* Результат
before: str = 0123456789 ,StringBufferLen(str) = 0 StringLen(str) = 10
after: str = 012345 ,StringBufferLen(str) = 16 StringLen(str) = 6
addition: str = 012345+ ,StringBufferLen(str) = 16 StringLen(str) = 7
*/

Смотри также

StringBufferLen(), StringLen(), StringFill(), StringInit()


StringSplit

Справочник MQL4 / Строковые функции / StringSplit

StringSplit

Получает из указанной строки подстроки по заданному разделителю и возвращает количество полученных подстрок.

int StringSplit(
const string string_value, // строка для поиска подстрок
const ushort separator, // разделитель, по которому в строке будут искаться подстроки
string & result[] // массив, переданный по ссылке, для получения найденных подстрок
);

Параметры

string_value

[in] Строка, из которой необходимо получить подстроки. Сама строка при этом не изменяется.

pos

[in] Код символа разделителя. Для получения кода можно использовать функцию StringGetCharacter().

result[]

[out] Массив строк, в который помещаются полученные подстроки.

Возвращаемое значение

Количество полученных строк в массиве result[]. Если разделитель в переданной строке не найден, то в массив будет помещена только одна исходная строка.

Если строка string_value пустая или NULL, то функция вернет ноль. В случае ошибки функция вернет -1. Для получения кода ошибки нужно вызвать функцию GetLastError().

Пример:

string to_split="мама_мыла_раму"; // строка для разбивки на подстроки
string sep="_"; // разделитель в виде символа
ushort u_sep; // код символа разделителя
string result[]; // массив для получения строк
//--- получим код разделителя
u_sep=StringGetCharacter(sep,0);
//--- разобьем строку на подстроки
int k=StringSplit(to_split,u_sep,result);
//--- выведем комментарий
PrintFormat("Получено строк: %d. Использован разделитель '%s' с кодом %d",k,sep,u_sep);
//--- теперь выведем все полученные строки
if(k>0)
{
for(int i=0;i<k;i++)
{
PrintFormat("result[%d]=%s",i,result[i]);
}
}

Смотри также

StringReplace(), StringSubstr(), StringConcatenate()


StringSubstr

Справочник MQL4 / Строковые функции / StringSubstr

StringSubstr

Извлекает подстроку из текстовой строки, начинающейся c указанной позиции.

string StringSubstr(
string string_value, // строка
int start_pos, // с какой позиции начать
int length=0 // длина извлекаемой строки
);

Параметры

string_value

[in] Строка, из которой должна быть извлечена подстрока.

start_pos

[in] Начальная позиция подстроки. Может быть от 0 до StringLen(text) -1.

length=0

[in] Длина извлекаемой подстроки. Если значение параметра меньше или равно 0, либо параметр не задан, то будет извлекаться подстрока, начиная с указанной позиции и до конца строки.

Возвращаемое значение

Копия извлеченной подстроки, если возможно, иначе возвращается пустая строка.

Пример:

string text = "Быстрая коричневая собака перепрыгивает ленивую лисицу";
string substr = StringSubstr(text, 8, 10);
// извлеченная строка "коричневая"


StringToLower

Справочник MQL4 / Строковые функции / StringToLower

StringToLower

Преобразует все символы указанной строки в строчные (маленькие) по месту.

bool StringToLower(
string& string_var // строка для обработки
);

Параметры

string_var

[in][out] Строка.

Возвращаемое значение

В случае успешного выполнения возвращает true, иначе false. Для получения кода ошибки нужно вызвать функцию GetLastError().


StringToUpper

Справочник MQL4 / Строковые функции / StringToUpper

StringToUpper

Преобразует все символы указанной строки в прописные (большие) по месту.

bool StringToUpper(
string& string_var // строка для обработки
);

Параметры

string_var

[in][out] Строка.

Возвращаемое значение

В случае успешного выполнения возвращает true, иначе false. Для получения кода ошибки нужно вызвать функцию GetLastError().


StringTrimLeft

Справочник MQL4 / Строковые функции / StringTrimLeft

StringTrimLeft

Удаляет символы перевода каретки, пробелы и символы табуляции с начала строки до первого значимого символа.

string StringTrimLeft(
const string text // строка
);

Параметры

text

[in] Строка, которая должна быть обрезана слева.

Возвращаемое значение

Копия преобразованной строки, если это возможно, в противном случае возвращается пустая строка.

Пример:

string str1=" Hello world ";
string str2=StringTrimLeft(str1);
// после срезания у переменной str2 будет значение - "Hello World "


StringTrimRight

Справочник MQL4 / Строковые функции / StringTrimRight

StringTrimRight

Удаляет символы перевода каретки, пробелы и символы табуляции в правой части строки.

string StringTrimRight(
const string text // строка
);

Параметры

text

[in] Строка, которая должна быть обрезана справа.

Возвращаемое значение

Копия преобразованной строки, если это возможно, в противном случае возвращается пустая строка.

Пример:

string str1=" Hello world ";
string str2=StringTrimRight(str1);
// после срезания у переменной str2 будет значение - " Hello World"


StringGetChar

Справочник MQL4 / Строковые функции / StringGetChar

StringGetChar

Возвращает значение символа, расположенного в указанной позиции строки.

int StringGetChar(
string string_value, // строка
int pos // позиция символа в строке
);

Параметры

string_value

[in] Строка.

pos

[in] Позиция символа в строке. Может быть от 0 до StringLen(text) -1.

Возвращаемое значение

Код символа, либо при 0 в случае ошибки. Для получения кода ошибки нужно вызвать функцию GetLastError().

Пример:

int char_code=StringGetChar("abcdefgh", 2);
// символьный код 'c' = 99


StringSetChar

Справочник MQL4 / Строковые функции / StringSetChar

StringSetChar

Возвращает копию строки с измененным значением символа в указанной позиции.

string StringSetChar(
string& string_var, // строка
int pos, // позиция
ushort value // код символа
);

Параметры

string_var

[in] Исходная строка.

pos

[in] Позиция символа в строке. Может быть от 0 до StringLen(text).

character

[in] Символьный код ASCII.

Возвращаемое значение

Копия строки с измененным значением символа в указанной позиции.

Примечание

Если значение pos меньше длины строки и значение символьного кода = 0, то результирующая строка усекается. Длина строки становится равной значению pos.

Если значение параметра pos равняется значению длины исходной строки, то указанный символ добавляется в конец результирующей строки.

Пример:

string str="abcdefgh";
string str1=StringSetChar(str, 3, 'D');
// str1 = "abcDefgh"

Смотри также

StringBufferLen(), StringLen(), StringFill(), StringInit()


Дата и время

Справочник MQL4 / Дата и время

Дата и время

Группа функций, обеспечивающих работу с данными типа datetime (целое число, представляющее собой количество секунд, прошедших с 0 часов 1 января 1970 года).

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

Функция | Действие
TimeCurrent | Возвращает последнее известное время сервера (время прихода последней котировки) в формате datetime
TimeLocal | Возвращает локальное компьютерное время в формате datetime
TimeGMT | Возвращает время GMT формате datetime с учетом перехода на зимнее или летнее время по локальному времени компьютера, на котором запущен клиентский терминал
TimeDaylightSavings | Возвращает признак перехода на летнее /зимнее время
TimeGMTOffset | Возвращает текущую разницу между временем GMT и локальным временем компьютера в секундах с учетом перехода на зимнее или летнее время
TimeToStruct | Производит конвертацию из значения типа datetime в переменную типа структуры MqlDateTime
StructToTime | Производит конвертацию из переменной типа структуры MqlDateTime в значение типа datetime
Day | Возвращает текущий день месяца, т.е. день месяца последнего известного времени сервера
DayOfWeek | Возвращает порядковый номер дня недели последнего известного времени сервера
DayOfYear | Возвращает текущий день года последнего известного времени сервера
Hour | Возвращает текущий час последнего известного серверного времени на момент старта программы
Minute | Возвращает текущую минуту последнего известного серверного времени на момент старта программы
Month | Возвращает номер текущего месяца последнего известного времени сервера
Seconds | Возвращает количество секунд, прошедших с начала текущей минуты последнего известного серверного времени на момент старта программы
TimeDay | Возвращает день месяца (1 - 31) указанной даты
TimeDayOfWeek | Возвращает день недели указанной даты
TimeDayOfYear | Возвращает день года указанной даты
TimeHour | Возвращает час указанного времени
TimeMinute | Возвращает минуту указанного времени
TimeMonth | Возвращает номер месяца указанного времени
TimeSeconds | Возвращает количество секунд, прошедших с начала минуты указанного времени
TimeYear | Возвращает год указанной даты
Year | Возвращает текущий год, т.е. год последнего известного времени сервера

Что нового в MQL5

Добавлена структура MqlDateTime, которая содержит восемь полей типа int:

struct MqlDateTime
{
int year; // год
int mon; // месяц
int day; // день
int hour; // час
int min; // минуты
int sec; // секунды
int day_of_week; // день недели (0-воскресенье, 1-понедельник, ... ,6-суббота)
int day_of_year; // порядковый номер в году (1 января имеет номер 0)
};

Таким образом, с помощью новых функций TimeToStruct() и StructToTime() за один вызов можно получать и передавать информацию о днях, часах, минутах и секундах.


TimeCurrent

Справочник MQL4 / Дата и время / TimeCurrent

TimeCurrent

Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов. В обработчике OnTick() данная функция вернет время пришедшего обрабатываемого тика. В других случаях (например, вызов в обработчиках OnInit(), OnDeinit(), OnTimer() и так далее) это – время прихода последней котировки по любому символу, доступного в окне "Обзор рынка", то самое время, которое показано в заголовке этого окна. Значение времени формируется на торговом сервере и не зависит от настроек времени на компьютере пользователя. Существует 2 варианта функции.

Вызов без параметров

datetime TimeCurrent();

Вызов с параметром типа MqlDateTime

datetime TimeCurrent(
MqlDateTime& dt_struct // переменная типа структуры
);

Параметры

dt_struct

[out] Переменная типа структуры MqlDateTime.

Возвращаемое значение

Значение типа datetime

Примечание

Если в качестве параметра была передана переменная типа структуры MqlDateTime, то она заполняется соответствующим образом.

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

При работе в тестере стратегий время последней котировки TimeCurrent() моделируется в соответствии с историческими данными.


TimeLocal

Справочник MQL4 / Дата и время / TimeLocal

TimeLocal

Возвращает локальное время компьютера, на котором запущен клиентский терминал. Существует 2 варианта функции.

Вызов без параметров

datetime TimeLocal();

Вызов с параметром типа MqlDateTime

datetime TimeLocal(
MqlDateTime& dt_struct // переменная типа структуры
);

Параметры

dt_struct

[out] Переменная типа структуры MqlDateTime.

Возвращаемое значение

Значение типа datetime

Примечание

Если в качестве параметра была передана переменная типа структуры MqlDateTime, то она заполняется соответствующим образом.

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

При работе в тестере стратегий локальное время TimeLocal() всегда равно моделируемому серверному времени TimeCurrent().


TimeGMT

Справочник MQL4 / Дата и время / TimeGMT

TimeGMT

Возвращает время GMT, которое вычисляется с учётом перехода на зимнее или летнее время по локальному времени компьютера, на котором запущен клиентский терминал. Существует 2 варианта функции.

Вызов без параметров

datetime TimeGMT();

Вызов с параметром типа MqlDateTime

datetime TimeGMT(
MqlDateTime& dt_struct // переменная типа структуры
);

Параметры

dt_struct

[out] Переменная типа структуры MqlDateTime.

Возвращаемое значение

Значение типа datetime

Примечание

Если в качестве параметра была передана переменная типа структуры MqlDateTime, то она заполняется соответствующим образом.

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

При работе в тестере стратегий время TimeGMT() всегда равно моделируемому серверному времени TimeCurrent().


TimeDayLightsavings

Справочник MQL4 / Дата и время / TimeDaylightSavings

TimeDaylightSavings

Возвращает поправку на летнее время в секундах, если был произведен переход на летнее время. Зависит от настроек времени на компьютере пользователя.

int TimeDaylightSavings();

Возвращаемое значение

Если был произведен переход на зимнее (стандартное) время, то возвращается 0.


TimeGMTOffset

Справочник MQL4 / Дата и время / TimeGMTOffset

TimeGMTOffset

Возвращает текущую разницу между временем GMT и локальным временем компьютера в секундах с учетом перехода на зимнее или летнее время. Зависит от настроек времени на компьютере пользователя.

int TimeGMTOffset();

Возвращаемое значение

Значение типа int, представляющее текущую разницу между временем GMT и локальным временем компьютера TimeLocal() и в секундах.

TimeGMTOffset() = TimeGMT() - TimeLocal()


TimeToStruct

Справочник MQL4 / Дата и время / TimeToStruct

TimeToStruct

Производит конвертацию из значения типа datetime (количество секунд с 01.01.1970) в переменную типа структуры MqlDateTime.

bool TimeToStruct(
datetime dt, // дата и время
MqlDateTime& dt_struct // структура для принятия значений
);

Параметры

dt

[in] Значение даты для конвертации.

dt_struct

[out] Переменная структуры типа MqlDateTime.

Возвращаемое значение

true – в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().


StructToTime

Справочник MQL4 / Дата и время / StructToTime

StructToTime

Производит конвертацию из переменной типа структуры MqlDateTime в значение типа datetime и возвращает полученное значение.

datetime StructToTime(
MqlDateTime& dt_struct // структура даты и времени
);

Параметры

dt_struct

[in] Переменная структуры типа MqlDateTime.

Возвращаемое значение

Значение типа datetime, содержащее количество секунд с 01.01.1970.


Day

Справочник MQL4 / Дата и время / Day

Day

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

int Day();

Возвращаемое значение

Текущий день месяца.

Примечание

При тестировании последнее известное время сервера моделируется.

Пример:

if(Day()<5) return(0);


DayOfWeek

Справочник MQL4 / Дата и время / DayOfWeek

DayOfWeek

Возвращает порядковый номер дня недели последнего известного времени сервера.

int DayOfWeek();

Возвращаемое значение

Порядковый номер дня недели (воскресенье-0,1,2,3,4,5,6).

Примечание

При тестировании последнее известное время сервера моделируется.

Пример:

// не работает в выходные дни.
if(DayOfWeek()==0 || DayOfWeek()==6) return(0);


DayOfYear

Справочник MQL4 / Дата и время / DayOfYear

DayOfYear

Возвращает текущий день года последнего известного времени сервера.

int DayOfYear();

Возвращаемое значение

Текущий день года (1-1 января,..,365(6) - 31 декабря).

Примечание

При тестировании последнее известное время сервера моделируется.

Пример:

if(DayOfYear()==245)
return(true);


Hour

Справочник MQL4 / Дата и время / Hour

Hour

Возвращает текущий час последнего известного серверного времени на момент старта программы (в процессе выполнения программы это значение не меняется).

int Hour();

Возвращаемое значение

Текущий час (0,1,2,..23) последнего известного серверного времени.

Примечание

При тестировании последнее известное время сервера моделируется.

Пример:

bool is_siesta=false;
if(Hour()>=12 && Hour()<17)
is_siesta=true;


Minute

Справочник MQL4 / Дата и время / Minute

Minute

Возвращает текущую минуту последнего известного серверного времени на момент старта программы (в процессе выполнения программы это значение не меняется).

int Minute();

Возвращаемое значение

Текущая минута (0,1,2,..59) последнего известного серверного времени.

Примечание

При тестировании последнее известное время сервера моделируется.

Пример:

if(Minute()<=15)
return("first quarter");


Month

Справочник MQL4 / Дата и время / Month

Month

Возвращает номер текущего месяца последнего известного времени сервера.

int Month();

Возвращаемое значение

Номер текущего месяца (1-Январь,2,3,4,5,6,7,8,9,10,11,12) последнего известного серверного времени.

Примечание

При тестировании последнее известное время сервера моделируется.

Пример:

if(Month()<=5)
return("первое полугодие");


Seconds

Справочник MQL4 / Дата и время / Seconds

Seconds

Возвращает количество секунд, прошедших с начала текущей минуты последнего известного серверного времени на момент старта программы (в процессе выполнения программы это значение не меняется).

int Seconds();

Возвращаемое значение

Количество секунд, прошедших с начала текущей минуты последнего известного серверного времени.

Примечание

При тестировании последнее известное время сервера моделируется.

Пример:

if(Seconds()<=15)
return(0);


TimeDay

Справочник MQL4 / Дата и время / TimeDay

TimeDay

Возвращает день месяца (1 - 31) указанной даты.

int TimeDay(
datetime date // дата и время
);

Параметры

date

[in] Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.

Возвращаемое значение

День месяца (1-31) указанной даты.

Пример:

int day=TimeDay(D'2003.12.31');
// день 31


TimeDayOfWeek

Справочник MQL4 / Дата и время / TimeDayOfWeek

TimeDayOfWeek

Возвращает день недели указанной даты.

int TimeDayOfWeek(
datetime date // дата и время
);

Параметры

date

[in] Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.

Возвращаемое значение

День недели (0-воскресенье,1,2,3,4,5,6) указанной даты.

Пример:

int weekday=TimeDayOfWeek(D'2004.11.2');
// день 2 - вторник


TimeDayOfYear

Справочник MQL4 / Дата и время / TimeDayOfYear

TimeDayOfYear

Возвращает день года указанной даты.

int TimeDayOfYear(
datetime date // дата и время
);

Параметры

date

[in] Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.

Возвращаемое значение

День года (1 - 1 января,..,365(6) - 31 декабря) указанной даты.

Пример:

int nday=TimeDayOfYear(TimeCurrent());


TimeHour

Справочник MQL4 / Дата и время / TimeHour

TimeHour

Возвращает час указанного времени.

int TimeHour(
datetime date // дата и время
);

Параметры

date

[in] Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.

Возвращаемое значение

Час (0-23) указанной даты.

Пример:

int h=TimeHour(TimeCurrent());


TimeMinute

Справочник MQL4 / Дата и время / TimeMinute

TimeMinute

Возвращает минуту указанного времени.

int TimeMinute(
datetime date // дата и время
);

Параметры

date

[in] Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.

Возвращаемое значение

Минута (0-59) указанной даты.

Пример:

int m=TimeMinute(TimeCurrent());


TimeMonth

Справочник MQL4 / Дата и время / TimeMonth

TimeMonth

Возвращает номер месяца указанного времени.

int TimeMonth(
datetime date // дата и время
);

Параметры

date

[in] Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.

Возвращаемое значение

Номер месяца (1-январь,2,3,4,5,6,7,8,9,10,11,12) указанного времени.

Пример:

int m=TimeMonth(TimeCurrent());


TimeSeconds

Справочник MQL4 / Дата и время / TimeSeconds

TimeSeconds

Возвращает количество секунд, прошедших с начала минуты указанного времени.

int TimeSeconds(
datetime date // дата и время
);

Параметры

date

[in] Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.

Возвращаемое значение

Количество секунд, прошедших с начала минуты указанного времени.

Пример:

int m=TimeSeconds(TimeCurrent());


TimeYear

Справочник MQL4 / Дата и время / TimeYear

TimeYear

Возвращает год указанной даты.

int TimeYear(
datetime date // дата и время
);

Параметры

date

[in] Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.

Возвращаемое значение

Год указанной даты. Возвращаемая величина может быть в диапазоне 1970-3000.

Пример:

int y=TimeYear(TimeCurrent());


Year

Справочник MQL4 / Дата и время / Year

Year

Возвращает текущий год, т.е. год последнего известного времени сервера.

int Year();

Возвращаемое значение

Текущий год.

Примечание

При тестировании последнее известное время сервера моделируется.

Пример:

// возврат, если дата находится в диапазоне от 1 января до 30 апреля 2006 года.
if(Year()==2006 && Month()<5)
return(0);


Информация о счете

Справочник MQL4 / Информация о счете

Информация о счете

Функции, возвращающие параметры текущего счета.

Функция | Действие
AccountInfoDouble | Возвращает значение типа double соответствующего свойства счета
AccountInfoInteger | Возвращает значение целочисленного типа (bool,int или long) соответствующего свойства счета
AccountInfoString | Возвращает значение типа string соответствующего свойства счета
AccountBalance | Возвращает значение баланса активного счета
AccountCredit | Возвращает значение кредита активного счета
AccountCompany | Возвращает название брокерской компании, в которой зарегистрирован текущий счет
AccountCurrency | Возвращает наименование валюты текущего счета
AccountEquity | Возвращает сумму собственных средств текущего счета
AccountFreeMargin | Возвращает значение свободных средств, разрешенных для открытия ордеров на текущем счете
AccountFreeMarginCheck | Возвращает размер свободных средств, которые останутся после открытия указанного ордера по текущей цене на текущем счете
AccountFreeMarginMode | Возвращает режим расчета свободных средств, разрешенных для открытия ордеров на текущем счете
AccountLeverage | Возвращает значение плеча текущего счета
AccountMargin | Возвращает сумму залоговых средств, используемых для поддержания открытых ордеров на текущем счете
AccountName | Возвращает имя пользователя текущего счета
AccountNumber | Возвращает номер текущего счета
AccountProfit | Возвращает значение прибыли текущего счета
AccountServer | Возвращает наименование активного сервера
AccountStopoutLevel | Возвращает значение уровня, по которому определяется состояние Stop Out
AccountStopoutMode | Возвращает режим расчета уровня Stop Out


AccountInfoDouble

Справочник MQL4 / Информация о счете / AccountInfoDouble

AccountInfoDouble

Возвращает значение соответствующего свойства счета.

double AccountInfoDouble(
int property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства. Значение может быть одним из значений ENUM_ACCOUNT_INFO_DOUBLE.

Возвращаемое значение

Значение типа double.

Пример:

void OnStart()
{
//--- выведем всю информацию, доступную из функции AccountInfoDouble()
printf("ACCOUNT_BALANCE = %G",AccountInfoDouble(ACCOUNT_BALANCE));
printf("ACCOUNT_CREDIT = %G",AccountInfoDouble(ACCOUNT_CREDIT));
printf("ACCOUNT_PROFIT = %G",AccountInfoDouble(ACCOUNT_PROFIT));
printf("ACCOUNT_EQUITY = %G",AccountInfoDouble(ACCOUNT_EQUITY));
printf("ACCOUNT_MARGIN = %G",AccountInfoDouble(ACCOUNT_MARGIN));
printf("ACCOUNT_MARGIN_FREE = %G",AccountInfoDouble(ACCOUNT_FREEMARGIN));
printf("ACCOUNT_MARGIN_LEVEL = %G",AccountInfoDouble(ACCOUNT_MARGIN_LEVEL));
printf("ACCOUNT_MARGIN_SO_CALL = %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL));
printf("ACCOUNT_MARGIN_SO_SO = %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_SO));
}

Смотри также

SymbolInfoDouble(), SymbolInfoString(), SymbolInfoInteger(), PrintFormat()


AccountInfoInteger

Справочник MQL4 / Информация о счете / AccountInfoInteger

AccountInfoInteger

Возвращает значение соответствующего свойства счета.

long AccountInfoInteger(
int property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства. Значение может быть одним из значений ENUM_ACCOUNT_INFO_INTEGER.

Возвращаемое значение

Значение типа long.

Примечание

Свойство должно быть одного из типов bool, int или long.

Пример:

void OnStart()
{
//--- выведем всю информацию, доступную из функции AccountInfoInteger()
printf("ACCOUNT_LOGIN = %d",AccountInfoInteger(ACCOUNT_LOGIN));
printf("ACCOUNT_LEVERAGE = %d",AccountInfoInteger(ACCOUNT_LEVERAGE));
bool thisAccountTradeAllowed=AccountInfoInteger(ACCOUNT_TRADE_ALLOWED);
bool EATradeAllowed=AccountInfoInteger(ACCOUNT_TRADE_EXPERT);
ENUM_ACCOUNT_TRADE_MODE tradeMode=(ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE);
ENUM_ACCOUNT_STOPOUT_MODE stopOutMode=(ENUM_ACCOUNT_STOPOUT_MODE)AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE);
//--- сообщим о возможности совершения торговых операций
if(thisAccountTradeAllowed)
Print("Торговля для данного счета разрешена");
else
Print("Торговля для данного счета запрещена!");
//--- выясним - можно ли торговать на данном счету экспертами
if(EATradeAllowed)
Print("Торговля советниками для данного счета разрешена");
else
Print("Торговля советниками для данного счета запрещена!");
//--- выясним тип счета
switch(tradeMode)
{
case(ACCOUNT_TRADE_MODE_DEMO):
Print("Это демо счет");
break;
case(ACCOUNT_TRADE_MODE_CONTEST):
Print("Это конкурсный счет");
break;
default:Print("Это реальный счет!");
}
//--- выясним режим задания уровня StopOut
switch(stopOutMode)
{
case(ACCOUNT_STOPOUT_MODE_PERCENT):
Print("Уровень StopOut задается в процентах");
break;
default:Print("Уровень StopOut задается в денежном выражении");
}
}

Смотри также

Информация о счете


AccountInfoString

Справочник MQL4 / Информация о счете / AccountInfoString

AccountInfoString

Возвращает значение соответствующего свойства счета.

string AccountInfoString(
int property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства. Значение может быть одним из значений ENUM_ACCOUNT_INFO_STRING.

Возвращаемое значение

Значение типа string.

Пример:

void OnStart()
{
//--- выведем всю информацию, доступную из функции AccountInfoString()
Print("Имя брокера = ",AccountInfoString(ACCOUNT_COMPANY));
Print("Валюта депозита = ",AccountInfoString(ACCOUNT_CURRENCY));
Print("Имя клиента = ",AccountInfoString(ACCOUNT_NAME));
Print("Название торгового сервера = ",AccountInfoString(ACCOUNT_SERVER));
}

Смотри также

Информация о счете


AccountBalance

Справочник MQL4 / Информация о счете / AccountBalance

AccountBalance

Возвращает значение баланса активного счета.

double AccountBalance();

Возвращаемое значение

Значение баланса активного счета (сумма денежных средств на счете).

Пример:

Print("Баланс счета = ",AccountBalance());


AccountCredit

Справочник MQL4 / Информация о счете / AccountCredit

AccountCredit

Возвращает значение кредита активного счета.

double AccountCredit();

Возвращаемое значение

Значение кредита активного счета.

Пример:

Print("Кредит счета ", AccountCredit());


AccountCompany

Справочник MQL4 / Информация о счете / AccountCompany

AccountCompany

Возвращает название брокерской компании, в которой зарегистрирован текущий счет.

string AccountCompany();

Возвращаемое значение

Название брокерской компании, в которой зарегистрирован текущий счет.

Пример:

Print("Счет зарегистрирован в компании ", AccountCompany());


AccountCurrency

Справочник MQL4 / Информация о счете / AccountCurrency

AccountCurrency

Возвращает наименование валюты текущего счета.

string AccountCurrency();

Возвращаемое значение

Наименование валюты текущего счета.

Пример:

Print("Валюта счета", AccountCurrency());


AccountEquity

Справочник MQL4 / Информация о счете / AccountEquity

AccountEquity

Возвращает сумму собственных средств текущего счета.

double AccountEquity();

Возвращаемое значение

Сумма собственных средств текущего счета. Расчет Equity зависит от настроек торгового сервера.

Пример:

Print("Средства счета = ",AccountEquity());


AccountFreeMargin

Справочник MQL4 / Информация о счете / AccountFreeMargin

AccountFreeMargin

Возвращает значение свободных средств, разрешенных для открытия ордеров на текущем счете.

double AccountFreeMargin();

Возвращаемое значение

Значение свободных средств, разрешенных для открытия ордеров на текущем счете.

Пример:

Print("Свободная маржа счета = ",AccountFreeMargin());


AccountFreeMarginCheck

Справочник MQL4 / Информация о счете / AccountFreeMarginCheck

AccountFreeMarginCheck

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

double AccountFreeMarginCheck(
string symbol, // символ
int cmd, // торговая операция
double volume // количество лотов
);

Параметры

symbol

[in] Наименование финансового инструмента, с которым должна проводиться торговая операция.

cmd

[in] Торговая операция. Может быть либо OP_BUY, либо OP_SELL.

volume

[in] Количество лотов.

Возвращаемое значение

Размер свободных средств, которые останутся после открытия указанного ордера по текущей цене на текущем счете. Если свободных средств не хватает, то будет сгенерирована ошибка 134 (ERR_NOT_ENOUGH_MONEY).

Пример:

if(AccountFreeMarginCheck(Symbol(),OP_BUY,Lots)<=0 || GetLastError()==134) return;


AccountFreeMarginMode

Справочник MQL4 / Информация о счете / AccountFreeMarginMode

AccountFreeMarginMode

Возвращает режим расчета свободных средств, разрешенных для открытия ордеров на текущем счете.

double AccountFreeMarginMode();

Возвращаемое значение

Режим расчета свободных средств, разрешенных для открытия ордеров на текущем счете.

Режим расчета может принимать следующие значения:
0 - при расчете не используются нереализованные прибыли и убытки;
1 - при расчете свободных средств используется как нереализованная прибыль, так и убыток по открытым позициям на текущем счете;
2 - при расчете используется только значение прибыли, текущий убыток по открытым ордерам не учитывается;
3 - при расчете используется только значение убытка, текущая прибыль по открытым ордерам не учитывается.

Пример:

if(AccountFreeMarginMode()==0)
Print("Нереализованные прибыли/убытки не используются.");


AccountLeverage

Справочник MQL4 / Информация о счете / AccountLeverage

AccountLeverage

Возвращает значение плеча текущего счета.

int AccountLeverage();

Возвращаемое значение

Значение плеча текущего счета.

Пример:

Print("Счет #",AccountNumber(), " плечо ", AccountLeverage());


AccountMargin

Справочник MQL4 / Информация о счете / AccountMargin

AccountMargin

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

double AccountMargin();

Возвращаемое значение

Сумма залоговых средств, используемых для поддержания открытых ордеров на текущем счете.

Пример:

Print("Сумма залоговых средств = ", AccountMargin());


AccountName

Справочник MQL4 / Информация о счете / AccountName

AccountName

Возвращает имя пользователя текущего счета.

string AccountName();

Возвращаемое значение

Имя пользователя, на которого зарегистрирован текущий счет.

Пример:

Print("Имя = ", AccountName());


AccountNumber

Справочник MQL4 / Информация о счете / AccountNumber

AccountNumber

Возвращает номер текущего счета.

int AccountNumber();

Возвращаемое значение

Номер текущего счета.

Пример:

Print("Номер счета = ", AccountNumber());


AccountProfit

Справочник MQL4 / Информация о счете / AccountProfit

AccountProfit

Возвращает значение прибыли текущего счета.

double AccountProfit();

Возвращаемое значение

Значение прибыли текущего счета в валюте депозита.

Пример:

Print("Прибыль ", AccountProfit());


AccountServer

Справочник MQL4 / Информация о счете / AccountServer

AccountServer

Возвращает наименование активного сервера.

string AccountServer();

Возвращаемое значение

Наименование активного сервера.

Пример:

Print("Сервер ", AccountServer());


AccountStopoutLevel

Справочник MQL4 / Информация о счете / AccountStopoutLevel

AccountStopoutLevel

Возвращает значение уровня, по которому определяется состояние Stop Out.

int AccountStopoutLevel();

Возвращаемое значение

Значение уровня, по которому определяется состояние Stop Out.

Пример:

Print("StopOut level = ", AccountStopoutLevel());


AccountStopoutMode

Справочник MQL4 / Информация о счете / AccountStopoutMode

AccountStopoutMode

Возвращает режим расчета уровня Stop Out.

int AccountStopoutMode();

Возвращаемое значение

Режим расчета уровня Stop Out.

Режим расчета может принимать следующие значения:
0 - расчет процентного соотношения залоговой маржи к средствам;
1 - сравнение уровня свободной маржи с абсолютным значением.

Пример:

int level=AccountStopoutLevel();
if(AccountStopoutMode()==0)
Print("StopOut level = ", level, "%");
else
Print("StopOut level = ", level, " ", AccountCurrency());


Проверка состояния

Справочник MQL4 / Проверка состояния

Проверка состояния

Функции, возвращающие параметры текущего состояния клиентского терминала

Функция | Действие
GetLastError | Возвращает значение последней ошибки
IsStopped | Возвращает true, если поступила команда завершить выполнение mql4-программы
UninitializeReason | Возвращает код причины деинициализации
MQLInfoInteger | Возвращает значение целого типа соответствующего свойства запущенной mql4-программы
MQLInfoString | Возвращает значение типа string соответствующего свойства запущенной mql4-программы
MQLSetInteger | Устанавливает значение свойства MQL_CODEPAGE в окружении mql4-программы
TerminalInfoInteger | Возвращает значение целого типа соответствующего свойства окружения mql4-программы
TerminalInfoDouble | Возвращает значение типа double соответствующего свойства запущенной mql4-программы
TerminalInfoString | Возвращает значение типа string соответствующего свойства окружения mql4-программы
Symbol | Возвращает имя символа текущего графика
Period | Возвращает значение таймфрейма текущего графика
Digits | Возвращает количество десятичных знаков после запятой, определяющее точность измерения цены символа текущего графика
Point | Возвращает размер пункта текущего инструмента в валюте котировки
IsConnected | Возвращает состояние главного соединения клиентского терминала с сервером, по которому производится подкачка данных
IsDemo | Возвращает признак работы на демонстрационном счете
IsDllsAllowed | Возвращает информацию о возможности вызова внешних функций из DLL
IsExpertEnabled | Возвращает информацию о возможности запуска экспертов
IsLibrariesAllowed | Возвращает информацию о возможности вызова библиотек
IsOptimization | Возвращает информацию о работе эксперта в процессе оптимизации параметров тестирования
IsTesting | Возвращает информацию о работе эксперта в режиме тестирования
IsTradeAllowed | Возвращает информацию о возможности торговли при помощи экспертов
IsTradeContextBusy | Возвращает информацию о состоянии потока выполнения торговых операций
IsVisualMode | Возвращает информацию о работе эксперта в режиме визуализации тестирования
TerminalCompany | Возвращает наименование компании-владельца клиентского терминала
TerminalName | Возвращает наименование клиентского терминала
TerminalPath | Возвращает каталог, из которого запущен клиентский терминал


GetLastError

Справочник MQL4 / Проверка состояния / GetLastError

GetLastError

Возвращает содержимое системной переменной _LastError.

int GetLastError();

Возвращаемое значение

Возвращает значение последней ошибки, произошедшей во время исполнения mql4-программы.

Примечание

После вызова функции содержимое переменной _LastError обнуляется.

Коды торговых ошибок для удобства дополнительно приведены отдельным списком в разделе Коды возврата торгового сервера.


IsStopped

Справочник MQL4 / Проверка состояния / IsStopped

IsStopped

Проверяет принудительное завершение работы mql4-программы.

bool IsStopped();

Возвращаемое значение

Возвращает true, если в системной переменной _StopFlag содержится значение, отличное от 0. Ненулевое значение записывается в переменную _StopFlag, если поступила команда завершить выполнение mql4-программы. В этом случае необходимо как можно быстрее завершить работу программы, в противном случае программа будет завершена принудительно извне через 3 секунды.


UninitializeReason

Справочник MQL4 / Проверка состояния / UninitializeReason

UninitializeReason

Возвращает код причины деинициализации.

int UninitializeReason();

Возвращаемое значение

Возвращает значение переменной _UninitReason, которое формируется перед вызовом функции OnDeinit(). Значение зависит от причины, приведшей к деинициализации.


MQLInfoInteger

Справочник MQL4 / Проверка состояния / MQLInfoInteger

MQLInfoInteger

Возвращает значение соответствующего свойства запущенной mql4-программы.

int MQLInfoInteger(
int property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства. Может быть одним из значений перечисления ENUM_MQL_INFO_INTEGER.

Возвращаемое значение

Значение типа int.


MQLInfoString

Справочник MQL4 / Проверка состояния / MQLInfoString

MQLInfoString

Возвращает значение соответствующего свойства запущенной mql4-программы.

string MQLInfoString(
int property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства. Может быть одним из значений перечисления ENUM_MQL_INFO_STRING.

Возвращаемое значение

Значение типа string.


MQLSetInteger

Справочник MQL4 / Проверка состояния / MQLSetInteger

MQLSetInteger

Устанавливает значение свойства MQL_CODEPAGE в окружении mql4-программы.

void MQLSetInteger(
int property_id // идентификатор свойства
int property_value // устанавливаемое значение
);

Параметры

property_id

[in] Идентификатор свойства. Может быть только MQL_CODEPAGE, так как остальные свойства не могут быть изменены.

property_value

[in] Значение свойства. Может быть одной из констант кодовой страницы.

Возвращаемое значение

Нет

Примечание

Функция MQLSetInteger() предназначена для изменения текущей кодовой страницы в запущенной mql4-программе. Это может понадобиться в тех случаях, когда для запускаемых mql4-программ терминал устанавливает по умолчанию кодовую страницу, отличающаяся от той, которая использовалась при её компиляции. Например, mql4-программа скомпилирована на компьютере с испанской локалью, а запускается на компьютере с китайской локалью.

В случаях, когда не совпадают локали компиляции и запуска mql4-программ, могут возникать ошибки отображения сообщений или ошибки получения значений. Это касается функций PrintFormat, Print, Comment, Alert, MessageBox, SendFTP, SendMail, SendNotification, iCustom и других, в которых в качестве параметра используются имена объектов, имена глобальных переменных и т.д.

Чтобы явно изменить кодовую страницу для работы со строками в данной запущенной программе, необходимо вызвать MQLSetInteger() с нужной кодовой страницей. Функция может быть особенно полезна для локализации выводимых пользователю сообщений.

Смотри также

Использование кодовой страницы


TerminalInfoInteger

Справочник MQL4 / Проверка состояния / TerminalInfoInteger

TerminalInfoInteger

Возвращает значение соответствующего свойства окружения mql4-программы.

int TerminalInfoInteger(
int property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства. Может быть одним из значений перечисления ENUM_TERMINAL_INFO_INTEGER.

Возвращаемое значение

Значение типа int.


TerminalInfoDouble

Справочник MQL4 / Проверка состояния / TerminalInfoDouble

TerminalInfoDouble

Возвращает значение соответствующего свойства окружения mql4-программы.

double TerminalInfoDouble(
int property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства. Может быть одним из значений перечисления ENUM_TERMINAL_INFO_DOUBLE.

Возвращаемое значение

Значение типа double.


TerminalInfoString

Справочник MQL4 / Проверка состояния / TerminalInfoString

TerminalInfoString

Функция возвращает значение соответствующего свойства окружения mql4-программы. Свойство должно быть типа string.

string TerminalInfoString(
int property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства. Может быть одним из значений перечисления ENUM_TERMINAL_INFO_STRING.

Возвращаемое значение

Значение типа string.


Symbol

Справочник MQL4 / Проверка состояния / Symbol

Symbol

Возвращает имя символа текущего графика.

string Symbol();

Возвращаемое значение

Значение системной переменной _Symbol, в которой хранится имя символа текущего графика.


Period

Справочник MQL4 / Проверка состояния / Period

Period

Возвращает значение таймфрейма текущего графика.

int Period();

Возвращаемое значение

Содержимое переменной _Period, в которой хранится значение таймфрейма текущего графика.

Смотри также

PeriodSeconds, Периоды графиков, Дата и время, , Видимость объектов


Digits

Справочник MQL4 / Проверка состояния / Digits

Digits

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

int Digits();

Возвращаемое значение

Значение переменной _Digits, в которой хранится количество десятичных знаков после запятой, определяющее точность измерения цены символа текущего графика.


Point

Справочник MQL4 / Проверка состояния / Point

Point

Возвращает размер пункта текущего инструмента в валюте котировки.

double Point();

Возвращаемое значение

Значение переменной _Point, в которой хранится размер пункта текущего инструмента в валюте котировки.


IsConnected

Справочник MQL4 / Проверка состояния / IsConnected

IsConnected

Возвращает состояние главного соединения клиентского терминала с сервером, по которому производится подкачка данных.

bool IsConnected();

Возвращаемое значение

Возвращает true, если связь с сервером установлена, или false, если связь с сервером отсутствует или прервана.

Пример:

if(!IsConnected())
{
Print("Связь отсутствует!");
return(0);
}
// Тело скрипта, нуждающегося в открытом подключении
// ...


IsDemo

Справочник MQL4 / Проверка состояния / IsDemo

IsDemo

Возвращает признак работы на демонстрационном счете.

bool IsDemo();

Возвращаемое значение

Возвращает true, если программа работает на демонстрационном счете, в противном случае возвращает false.

Пример:

if(IsDemo()) Print("Я работаю на демонстрационном счете");
else Print("Я работаю на реальном счете");


IsDllsAllowed

Справочник MQL4 / Проверка состояния / IsDllsAllowed

IsDllsAllowed

Возвращает информацию о возможности вызова внешних функций из DLL.

bool IsDllsAllowed();

Возвращаемое значение

Возвращает true, если вызовы функций из DLL разрешены для эксперта, иначе возвращает false.

Пример:

#import "user32.dll"
int MessageBoxA(int hWnd, string szText, string szCaption,int nType);
...
...
if(IsDllsAllowed()==false)
{
Print("Вызов из библиотек (DLL) невозможен. Эксперт не может выполняться.");
return(0);
}
// Тело Эксперта, вызывающее внешние функции DLL
MessageBoxA(0,"an message","Message",MB_OK);

Смотри также

IsLibrariesAllowed(), IsTradeAllowed()


IsExpertEnabled

Справочник MQL4 / Проверка состояния / IsExpertEnabled

IsExpertEnabled

Возвращает информацию о возможности запуска экспертов.

bool IsExpertEnabled();

Возвращаемое значение

Возвращает true, если в клиентском терминале разрешен запуск экспертов, иначе возвращает false.

Пример:

while(!IsStopped())
{
...
if(!IsExpertEnabled()) break;
}


IsLibrariesAllowed

Справочник MQL4 / Проверка состояния / IsLibrariesAllowed

IsLibrariesAllowed

Возвращает информацию о возможности вызова библиотек.

bool IsLibrariesAllowed();

Возвращаемое значение

Возвращает true, если эксперт может вызвать библиотечную функцию, иначе возвращает false.

Пример:

#import "somelibrary.ex4"
int somefunc();
...
...
if(IsLibrariesAllowed()==false)
{
Print("Библиотечные вызовы запрещены.");
return(0);
}
// Тело Эксперта, вызывающее внешние функции DLL
somefunc();

Смотри также

IsDllSAllowed, IsTradeAllowed


IsOptimization

Справочник MQL4 / Проверка состояния / IsOptimization

IsOptimization

Возвращает информацию о работе эксперта в процессе оптимизации параметров тестирования.

bool IsOptimization();

Возвращаемое значение

Возвращает true, если эксперт работает в режиме оптимизации тестирования, иначе возвращает false.

Пример:

if(IsOptimization()) return(0);


IsTesting

Справочник MQL4 / Проверка состояния / IsTesting

IsTesting

Возвращает информацию о работе эксперта в режиме тестирования.

bool IsTesting();

Возвращаемое значение

Возвращает true, если эксперт работает в режиме тестирования, иначе возвращает false.

Пример:

if(IsTesting()) Print("Тестирование эксперта");


IsTradeAllowed

Справочник MQL4 / Проверка состояния / IsTradeAllowed

IsTradeAllowed

Возвращает информацию о возможности торговли при помощи экспертов.

bool IsTradeAllowed();

Вторая форма вызова возвращает информацию о возможности торговли для заданного символа в указанное время.

bool IsTradeAllowed(
const string symbol // символ
datetime tested_time // время
);

Параметры

symbol

[in] Символ.

tested_time

[in] Время.

Возвращаемое значение

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

Примечание

Торговые функции OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete(), изменяющие состояние торгового счета, могут быть вызваны только в том случае, если эксперту разрешено торговать (в свойствах соответствующего эксперта или скрипта включена галочка "Разрешить советнику торговать").

Пример:

if(IsTradeAllowed()) Print("Торговля разрешена");

Смотри также

IsDllsAllowed(), IsLibrariesAllowed(), IsTradeContextBusy()


IsTradeContextBusy

Справочник MQL4 / Проверка состояния / IsTradeContextBusy

IsTradeContextBusy

Возвращает информацию о состоянии потока выполнения торговых операций.

bool IsTradeContextBusy();

Возвращаемое значение

Возвращает true, если поток для выполнения торговых операций занят, иначе возвращает false.

Пример:

if(IsTradeContextBusy()) Print("Торговый поток занят. Подождите");


IsVisualMode

Справочник MQL4 / Проверка состояния / IsVisualMode

IsVisualMode

Возвращает информацию о работе эксперта в режиме визуализации тестирования.

bool IsVisualMode();

Возвращаемое значение

Возвращает true, если эксперт работает в режиме визуализации тестирования, иначе возвращает false.

Пример:

if(IsVisualMode()) Comment("Визуализация включена");


TerminalCompany

Справочник MQL4 / Проверка состояния / TerminalCompany

TerminalCompany

Возвращает наименование компании-владельца клиентского терминала.

string TerminalCompany();

Возвращаемое значение

Наименование компании-владельца клиентского терминала.

Пример:

Print("Компания ",TerminalCompany());

Смотри также

TerminalName(), TerminalPath()


TerminalName

Справочник MQL4 / Проверка состояния / TerminalName

TerminalName

Возвращает наименование клиентского терминала.

string TerminalName();

Возвращаемое значение

Наименование клиентского терминала.

Пример:

Print("Работает терминал ",TerminalName());

Смотри также

TerminalCompany(), TerminalPath()


TerminalPath

Справочник MQL4 / Проверка состояния / TerminalPath

TerminalPath

Возвращает каталог, из которого запущен клиентский терминал.

string TerminalPath();

Возвращаемое значение

Каталог, из которого запущен клиентский терминал.

Пример:

Print("Рабочий каталог ",TerminalPath());

Смотри также

TerminalCompany(), TerminalName()


Получение рыночной информации

Справочник MQL4 / Получение рыночной информации

Получение рыночной информации

Функции для получения информации о состоянии рынка.

Функция | Действие
MarketInfo | Возвращает различную информацию о финансовых инструментах, перечисленных в окне "Обзор рынка"
SymbolsTotal | Возвращает количество доступных (выбранных в в окне "Обзор рынка" или всех) символов
SymbolName | Возвращает наименование указанного символа
SymbolSelect | Выбирает символ в окне "Обзор рынка" или убирает символ из окна
SymbolInfoDouble | Возвращает значение типа double указанного символа для соответствующего свойства
SymbolInfoInteger | Возвращает значение целочисленного типа (long, datetime, int или bool) указанного символа для соответствующего свойства
SymbolInfoString | Возвращает значение типа string указанного символа для соответствующего свойства
SymbolInfoTick | Возвращает текущие цены для указанного символа в переменной типа MqlTick
SymbolInfoSessionQuote | Позволяет получить время начала и время окончания указанной котировочной сессии для указанных символа и дня недели.
SymbolInfoSessionTrade | Позволяет получить время начала и время окончания указанной торговой сессии для указанных символа и дня недели.

Что нового в MQL5

Для получения информации на бирже добавлены функции по работе со стаканом цен. Термин произошел от английского DOM – Depth of Market. Визуально он представляет собой таблицу лимитных заявок на покупку и продажу торгуемых активов. Формат одинаков для валютных пар, акций, металлов, фьючерсов.

С торговой площадки в платформу передается стакан цен с заявками от участников торгов. На основе лучших заявок в стакане формируются цены Bid и Ask, которые показываются в Обзоре рынка. Кроме того биржа передает цены и объемы последних заключенных сделок – Last и Volume. Цены Last используются для построения ценовых графиков, а также для показа ленты сделок:

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

Функция | Действие
MarketBookAdd | Открывает стакан цен по указанному инструменту, а также производит подписку на получение изменений стакана
MarketBookRelease | Закрывает стакан цен по указанному инструменту, а также отменяет подписку на изменения стакана
MarketBookGet | Возвращает массив структур типа MqlBookInfo, содержащий данные из стакана цен указанного символа


MarketInfo

Справочник MQL4 / Получение рыночной информации / MarketInfo

MarketInfo

Возвращает различную информацию о финансовых инструментах, перечисленных в окне "Обзор рынка".

double MarketInfo(
string symbol, // символ инструмента
int type // тип информации
);

Параметры

symbol

[in] Имя символа.

type

[in] Идентификатор запроса, определяющий тип возвращаемой информации. Может быть любым из значений идентификаторов запроса.

Возвращаемое значение

Информация о финансовом инструменте. Часть информации о текущем финансовом инструменте хранится в предопределенных переменных.

Пример:

double vbid = MarketInfo("EURUSD",MODE_BID);
double vask = MarketInfo("EURUSD",MODE_ASK);
double vpoint = MarketInfo("EURUSD",MODE_POINT);
int vdigits = (int)MarketInfo("EURUSD",MODE_DIGITS);
int vspread = (int)MarketInfo("EURUSD",MODE_SPREAD);

Смотри также

Информация об инструменте


SymbolsTotal

Справочник MQL4 / Получение рыночной информации / SymbolsTotal

SymbolsTotal

Возвращает количество доступных (выбранных в MarketWatch или всех) символов.

int SymbolsTotal(
bool selected // true – только символы в MarketWatch
);

Параметры

selected

[in] Режим запроса. Может принимать значения true или false.

Возвращаемое значение

Если параметр selected равно true, то возвращается количество выбранных в MarketWatch символов. Если значение false, то возвращается общее количество всех символов.


SymbolName

Справочник MQL4 / Получение рыночной информации / SymbolName

SymbolName

Возвращает наименование указанного символа.

string SymbolName(
int pos, // номер в списке
bool selected // true – только символы в MarketWatch
);

Параметры

pos

[in] Номер символа по порядку.

selected

[in] Режим запроса. Если значение true, то символ берется из списка выбранных в MarketWatch. Если значение false, то символ берется из общего списка.

Возвращаемое значение

Значение типа string c именем символа.


SymbolSelect

Справочник MQL4 / Получение рыночной информации / SymbolSelect

SymbolSelect

Выбирает символ в окне MarketWatch (Обзор рынка) или убирает символ из этого окна.

bool SymbolSelect(
string name, // имя символа
bool select // включить или выключить
);

Параметры

name

[in] Имя символа.

select

[in] Переключатель. Если значение false, то символ должен быть убран из окна MarketWatch, в противном случае символ должен быть выбран в окно MarketWatch. Символ не может быть убран, если есть открытые графики с этим символом или есть открытые ордера по этому символу.

Возвращаемое значение

В случае неудачи функция возвращает false.

Примечание

Для получения данных по символу с помощью функций доступа к таймсериям и индикаторам необходимо, чтобы данный символ был включен в окне MarketWatch. Если символ отсутствует в нем, то перед запросом данных нужно его включить с помощью функции SymbolSelect(symbol_name, true).

Скрыть символ из окна MarketWatch можно будет через 10 минут после последнего обращения к истории символа, то есть с момента последнего вызова функций вида iOpen(), iHigh(), CopyTime() и т.д. Это обусловлено тем, что терминал хранит полученные данные по символу в течение 10 минут с момента последнего обращения к ним, после чего неиспользуемые данные автоматически удаляются из памяти терминала.


SymbolInfoDouble

Справочник MQL4 / Получение рыночной информации / SymbolInfoDouble

SymbolInfoDouble

Возвращает соответствующее свойство указанного символа. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

double SymbolInfoDouble(
string name, // символ
ENUM_SYMBOL_INFO_DOUBLE prop_id // идентификатор свойства
);

2. Возвращает true или false в зависимости от успешности выполнения функции. В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool SymbolInfoDouble(
string name, // символ
ENUM_SYMBOL_INFO_DOUBLE prop_id, // идентификатор свойства
double& double_var // сюда примем значение свойства
);

Параметры

name

[in] Имя символа.

prop_id

[in] Идентификатор свойства символа. Значение может быть одним из значений перечисления ENUM_SYMBOL_INFO_DOUBLE.

double_var

[out] Переменная типа double, принимающая значение запрашиваемого свойства.

Возвращаемое значение

Значение типа double. В случае неудачного выполнения информацию об ошибкe можно получить с помощью функции GetLastError():

  • 4106 – символ не выбран в "Обзоре рынка" (нет в списке доступных),
  • 4051 – неверный идентификатор свойства символа,
  • 4024 – внутренняя ошибка.

Примечание

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

В большинстве случаев достаточно использовать функцию SymbolInfoTick(), которая позволяет получить за один вызов значения Ask, Bid, Last, Volume и время прихода последнего тика.

Пример:

void OnTick()
{
//--- получим спред из свойств символа
bool spreadfloat=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD_FLOAT);
string comm=StringFormat("Спред %s = %I64d пунктов\r\n",
spreadfloat?"плавающий":"фиксированный",
SymbolInfoInteger(Symbol(),SYMBOL_SPREAD));
//--- вычислим теперь спред сами
double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
double spread=ask-bid;
int spread_points=(int)MathRound(spread/SymbolInfoDouble(Symbol(),SYMBOL_POINT));
comm=comm+"Вычисленный спред = "+(string)spread_points+" пунктов";
Comment(comm);
}


SymbolInfoInteger

Справочник MQL4 / Получение рыночной информации / SymbolInfoInteger

SymbolInfoInteger

Возвращает соответствующее свойство указанного символа. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

long SymbolInfoInteger(
string name, // символ
ENUM_SYMBOL_INFO_INTEGER prop_id // идентификатор свойства
);

2. Возвращает true или false в зависимости от успешности выполнения функции. В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool SymbolInfoInteger(
string name, // символ
ENUM_SYMBOL_INFO_INTEGER prop_id, // идентификатор свойства
long& long_var // сюда примем значение свойства
);

Параметры

name

[in] Имя символа.

prop_id

[in] Идентификатор свойства символа. Значение может быть одним из значений перечисления ENUM_SYMBOL_INFO_INTEGER.

long_var

[out] Переменная типа long, принимающая значение запрашиваемого свойства.

Возвращаемое значение

Значение типа long. В случае неудачного выполнения информацию об ошибкe можно получить с помощью функции GetLastError():

  • 4106 – символ не выбран в "Обзоре рынка" (нет в списке доступных),
  • 4051 – неверный идентификатор свойства символа,
  • 4024 – внутренняя ошибка.

Примечание

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

В большинстве случаев достаточно использовать функцию SymbolInfoTick(), которая позволяет получить за один вызов значения Ask, Bid, Last, Volume и время прихода последнего тика.

Пример:

void OnTick()
{
//--- получим спред из свойств символа
bool spreadfloat=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD_FLOAT);
string comm=StringFormat("Спред %s = %I64d пунктов\r\n",
spreadfloat?"плавающий":"фиксированный",
SymbolInfoInteger(Symbol(),SYMBOL_SPREAD));
//--- вычислим теперь спред сами
double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
double spread=ask-bid;
int spread_points=(int)MathRound(spread/SymbolInfoDouble(Symbol(),SYMBOL_POINT));
comm=comm+"Вычисленный спред = "+(string)spread_points+" пунктов";
Comment(comm);
}


SymbolInfoString

Справочник MQL4 / Получение рыночной информации / SymbolInfoString

SymbolInfoString

Возвращает соответствующее свойство указанного символа. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

string SymbolInfoString(
string name, // символ
ENUM_SYMBOL_INFO_STRING prop_id // идентификатор свойства
);

2. Возвращает true или false в зависимости от успешности выполнения функции. В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool SymbolInfoString(
string name, // символ
ENUM_SYMBOL_INFO_STRING prop_id, // идентификатор свойства
string& string_var // сюда примем значение свойства
);

Параметры

name

[in] Имя символа.

prop_id

[in] Идентификатор свойства символа. Значение может быть одним из значений перечисления ENUM_SYMBOL_INFO_STRING.

string_var

[out] Переменная типа string, принимающая значение запрашиваемого свойства. В случае неудачного выполнения информацию об ошибкe можно получить с помощью функции GetLastError():

Возвращаемое значение

Значение типа string. В случае неудачного выполнения информацию об ошибкe можно получить с помощью функции GetLastError():

  • 4106 – символ не выбран в "Обзоре рынка" (нет в списке доступных),
  • 4051 – неверный идентификатор свойства символа,
  • 4024 – внутренняя ошибка.

Примечание

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

В большинстве случаев достаточно использовать функцию SymbolInfoTick(), которая позволяет получить за один вызов значения Ask, Bid, Last, Volume и время прихода последнего тика.

Возвращаемое значение

Значение типа string.


SymbolInfoTick

Справочник MQL4 / Получение рыночной информации / SymbolInfoTick

SymbolInfoTick

Возвращает текущие цены для указанного символа в переменной типа MqlTick.

bool SymbolInfoTick(
string symbol, // символ
MqlTick& tick // ссылка на структуру
);

Параметры

symbol

[in] Имя символа.

tick

[out] Ссылка на структуру типа MqlTick, в которую будут помещены текущие цены и время последнего обновления цен.

Возвращаемое значение

Возвращает true в случае успеха, иначе false.


SymbolInfoSessionQuote

Справочник MQL4 / Получение рыночной информации / SymbolInfoSessionQuote

SymbolInfoSessionQuote

Позволяет получить время начала и время окончания указанной котировочной сессии для указанных символа и дня недели.

bool SymbolInfoSessionQuote(
string name, // имя символа
ENUM_DAY_OF_WEEK day_of_week, // день недели
uint session_index, // номер сессии
datetime& from, // время начала сессии
datetime& to // время окончания сессии
);

Параметры

name

[in] Имя символа.

ENUM_DAY_OF_WEEK

[in] День недели, значение из перечисления ENUM_DAY_OF_WEEK.

uint

[in] Порядковый номер сессии, для которой нужно получить время начала и время окончания. Индексация сессий начинается с 0.

from

[out] Время начала сессии в секундах от 00 часов 00 минут, в полученном значении дату следует игнорировать.

to

[out] Время окончания сессии в секундах от 00 часов 00 минут, в полученном значении дату следует игнорировать.

Возвращаемое значение

Если данные для указанных сессии, символа и дня недели получены, то возвращает true, иначе возвращает false.

Смотри также

Информация об инструменте, TimeToStruct, Структура даты


SymbolInfoSessionTrade

Справочник MQL4 / Получение рыночной информации / SymbolInfoSessionTrade

SymbolInfoSessionTrade

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

bool SymbolInfoSessionTrade(
string name, // имя символа
ENUM_DAY_OF_WEEK day_of_week, // день недели
uint session_index, // номер сессии
datetime& from, // время начала сессии
datetime& to // время окончания сессии
);

Параметры

name

[in] Имя символа.

ENUM_DAY_OF_WEEK

[in] День недели, значение из перечисления ENUM_DAY_OF_WEEK.

uint

[in] Порядковый номер сессии, для которой нужно получить время начала и время окончания. Индексация сессий начинается с 0.

from

[out] Время начала сессии в секундах от 00 часов 00 минут, в полученном значении дату следует игнорировать.

to

[out] Время окончания сессии в секундах от 00 часов 00 минут, в полученном значении дату следует игнорировать.

Возвращаемое значение

Если данные для указанных сессии, символа и дня недели получены, то возвращает true, иначе возвращает false.

Смотри также

Информация об инструменте, TimeToStruct, Структура даты


Доступ к таймсериям и индикаторам

Справочник MQL4 / Доступ к таймсериям и индикаторам

Доступ к таймсериям и данным индикаторов

Функции для работы с таймсериями и индикаторами. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым). Для копирования значений таймсерий и индикаторов рекомендуется использовать только динамические массивы, так как функции копирования самостоятельно распределяют необходимый размер массивов-приемников значений.

Из этого правила есть важное исключение: если копирование таймсерий и значений индикаторов необходимо делать часто, например, при каждом вызове OnTick() в экспертах или при каждом вызове OnCalculate() в индикаторах, то в этом случае лучше использовать статически распределенные массивы, так как операции распределения памяти под динамические массивы требуют дополнительного времени и это скажется при тестировании и оптимизации экспертов.

При использовании функций доступа к таймсериям и значениям индикаторов необходимо учитывать направление индексации, это подробно описано в разделе Направление индексации в массивах и таймсериях.

Доступ к данным индикаторов и таймсерий осуществляется независимо от факта готовности запрашиваемых данных (так называемый асинхронный доступ). Это критически важно для расчета пользовательских индикаторов, поэтому при отсутствии запрашиваемых данных функции типа Copy...() сразу же возвращают ошибку. Однако при доступе из экспертов и скриптов производится несколько попыток получения данных с небольшой паузой, призванной обеспечить время, необходимое для загрузки недостающих таймсерий либо для расчета значений индикаторов.

Если запрашивается информация с другого графика (название инструмента и/или значение таймфрейма отличаются от текущих), то возможна ситуация, что в клиентском терминале не открыт соответствующий график и необходимые данные должны быть запрошены у сервера. В этом случае в переменную _Last_error будет помещена ошибка ERR_HISTORY_WILL_UPDATED (4066 - запрошенные исторические данные в состоянии обновления) и необходимо через некоторое время повторить попытку запроса (см. пример ArrayCopySeries()).

Направление индексации в таймсерии и в обычном массиве

Исторически сложилось так, что доступ к данным в ценовом массиве производился с конца данных. Физически новые данные всегда дописываются в конец массива, но индекс этого массива всегда равен нулю. Индекс 0 в массиве-таймсерии означает данные текущего бара, то есть бара, который соответствует незавершенному промежутку времени на данном таймфрейме.

Таймфрейм – период времени, в течение которого формируется один ценовой бар. Существует несколько предопределенных стандартных таймфреймов.

Функция | Действие
SeriesInfoInteger | Возвращает информацию о состоянии исторических данных
RefreshRates | Осуществляет обновление данных в предопределенных переменных и массивах-таймсериях
CopyRates | Получает в массив исторические данные структуры Rates для указанных символа и периода
CopyTime | Получает в массив исторические данные по времени открытия баров по соответствующим символу и периоду
CopyOpen | Получает в массив исторические данные по цене открытия баров по соответствующим символу и периоду
CopyHigh | Получает в массив исторические данные по максимальной цене баров по соответствующим символу и периоду
CopyLow | Получает в массив исторические данные по минимальной цене баров по соответствующим символу и периоду
CopyClose | Получает в массив исторические данные по цене закрытия баров по соответствующим символу и периоду
CopyTickVolume | Получает в массив исторические данные по тиковым объемам для соответствующих символа и периода
Bars | Возвращает количество баров в истории по соответствующему символу периоду
iBars | Возвращает количество баров в истории по соответствующему символу и периоду
iBarShift | Возвращает смещение бара, которому принадлежит указанное время
iClose | Возвращает значение цены закрытия бара соответствующего графика
iHigh | Возвращает значение максимальной цены бара соответствующего графика
iHighest | Возвращает индекс наибольшего найденного значения соответствующего графика
iLow | Возвращает значение минимальной цены бара соответствующего графика
iLowest | Возвращает индекс наименьшего найденного значения соответствующего графика
iOpen | Возвращает значение цены открытия бара соответствующего графика
iTime | Возвращает значение времени открытия бара соответствующего графика
iVolume | Возвращает значение тикового объема бара соответствующего графика

Несмотря на то, что функцией ArraySetAsSeries() можно задавать массивам способ доступа к элементам как для таймсерии, нужно помнить, что физически элементы массива всегда хранятся в одном и том же порядке, меняется только направление индексации. Для демонстрации этого факта можно выполнить пример:

datetime TimeAsSeries[];
//--- установим доступ к массиву как к таймсерии
ArraySetAsSeries(TimeAsSeries,true);
ResetLastError();
int copied=CopyTime(NULL,0,0,10,TimeAsSeries);
if(copied<=0)
{
Print("Не удалось скопировать время открытия для последних 10 баров");
return;
}
Print("TimeCurrent = ",TimeCurrent());
Print("ArraySize(Time) = ",ArraySize(TimeAsSeries));
int size=ArraySize(TimeAsSeries);
for(int i=0;i<size;i++)
{
Print("TimeAsSeries["+i+"] = ",TimeAsSeries[i]);
}

datetime ArrayNotSeries[];
ArraySetAsSeries(ArrayNotSeries,false);
ResetLastError();
copied=CopyTime(NULL,0,0,10,ArrayNotSeries);
if(copied<=0)
{
Print("Не удалось скопировать время открытия для последних 10 баров");
return;
}
size=ArraySize(ArrayNotSeries);
for(int i=size-1;i>=0;i--)
{
Print("ArrayNotSeries["+i+"] = ",ArrayNotSeries[i]);
}

В результате будет произведен вывод подобный этому:

TimeCurrent = 2009.06.11 14:16:23
ArraySize(Time) = 10
TimeAsSeries[0] = 2009.06.11 14:00:00
TimeAsSeries[1] = 2009.06.11 13:00:00
TimeAsSeries[2] = 2009.06.11 12:00:00
TimeAsSeries[3] = 2009.06.11 11:00:00
TimeAsSeries[4] = 2009.06.11 10:00:00
TimeAsSeries[5] = 2009.06.11 09:00:00
TimeAsSeries[6] = 2009.06.11 08:00:00
TimeAsSeries[7] = 2009.06.11 07:00:00
TimeAsSeries[8] = 2009.06.11 06:00:00
TimeAsSeries[9] = 2009.06.11 05:00:00

ArrayNotSeries[9] = 2009.06.11 14:00:00
ArrayNotSeries[8] = 2009.06.11 13:00:00
ArrayNotSeries[7] = 2009.06.11 12:00:00
ArrayNotSeries[6] = 2009.06.11 11:00:00
ArrayNotSeries[5] = 2009.06.11 10:00:00
ArrayNotSeries[4] = 2009.06.11 09:00:00
ArrayNotSeries[3] = 2009.06.11 08:00:00
ArrayNotSeries[2] = 2009.06.11 07:00:00
ArrayNotSeries[1] = 2009.06.11 06:00:00
ArrayNotSeries[0] = 2009.06.11 05:00:00

Как видно из результатов вывода, для массива TimeAsSeries с ростом индекса уменьшается значение времени, находящегося под этим индексом, то есть мы продвигаемся от настоящего к прошлому. Для обычного массива ArrayNotSeries все наоборот - с ростом индекса мы двигаемся из прошлого к настоящему.

Смотри также

ArrayIsDynamic, ArrayGetAsSeries, ArraySetAsSeries, ArrayIsSeries


Направление индексации в массивах и таймсериях

Справочник MQL4 / Доступ к таймсериям и индикаторам / Направление индексации в массивах и таймсериях

Направление индексации в массивах, буферах и таймсериях

Все массивы и индикаторные буферы по умолчанию имеют направление индексации слева направо. Индекс первого элемента всегда равен нулю. Таким образом, самый первый элемент массива или индикаторного буфера с индексом 0 по умолчанию находится на крайней левой позиции, последний элемент находится на крайней правой позиции.

Индикаторный буфер представляет из себя динамический массив типа double, размером которого управляет клиентский терминал с тем, чтобы он всегда соответствовал количеству баров, на которых индикатор рассчитывается. Обычный динамический массив типа double назначается в качестве индикаторного буфера с помощью функции SetIndexBuffer(). Для индикаторных буферов не требуется задавать размер с помощью функции ArrayResize(), исполняющая система терминала сама позаботится об этом.

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

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

Изменение направления индексации

Функция ArraySetAsSeries() позволяет изменять способ доступа к элементам динамического массива, но при этом физически порядок хранения данных в памяти компьютера не изменяется. Эта функция просто изменяет способ адресации к элементам массива, поэтому при копировании одного массива в другой с помощью функции ArrayCopy() содержимое массива-приемника не будет зависеть от направления индексации в массиве-источнике.

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

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

Получение ценовых данных в индикаторах

В каждом пользовательском индикаторе обязательно должна присутствовать функция OnCalculate(), которой передаются ценовые данные, необходимые для расчета значений в индикаторных буферах. Направление индексации в этих переданных массивах можно выяснить с помощью функции ArrayGetAsSeries().

Переданные в функцию массивы отражают ценовые данные, т.е. эти массивы имеют признак таймсерии и функция ArrayIsSeries() вернет true при проверке этих массивов. Но тем не менее, направление индексации необходимо в любом случае проверять только функцией ArrayGetAsSeries().

Чтобы не зависеть от умолчаний, необходимо безусловно вызывать функцию ArraySetAsSeries() для тех массивов, с которыми предполагается работать, и установить требуемое направление индексации.

Получение ценовых данных и значений индикаторов

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

Для получения таких данных служат функции Copy...():

  • CopyRates – копирование ценовой истории в массив структур MqlRates;
  • CopyTime – копирование значений Time в массив типа datetime;
  • CopyOpen – копирование значений Open в массив типа double;
  • CopyHigh – копирование значений High в массив типа double;
  • CopyLow – копирование значений Low в массив типа double;
  • CopyClose – копирование значений Close в массив типа double;
  • CopyTickVolume – копирование тиковых объемов в массив типа long;

Все эти функции работают одинаково, и поэтому достаточно рассмотреть механизм получения данных на примере CopyOpen(). Подразумевается, что все запрашиваемые данные имеют направление индексации, как в таймсерии, при этом подразумевается, что в позиции с индексом 0 (ноль) хранятся данные текущего незавершенного бара. Чтобы получить доступ к этим данным, нам необходимо скопировать нужный нам объем данных в массив-приемник, например, в массив buffer.

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

Смотри также

ArrayGetAsSeries, ArrayIsSeries, ArraySetAsSeries


SeriesInfoInteger

Справочник MQL4 / Доступ к таймсериям и индикаторам / SeriesInfoInteger

SeriesInfoInteger

Возвращает информацию о состоянии исторических данных. Существует 2 варианта функции.

Непосредственно возвращает значение свойства.

long SeriesInfoInteger(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
ENUM_SERIES_INFO_INTEGER prop_id // идентификатор свойства
);

Возвращает true или false в зависимости от успешности выполнения функции.

bool SeriesInfoInteger(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
ENUM_SERIES_INFO_INTEGER prop_id, // идентификатор свойства
long& long_var // переменная для получения информации
);

Параметры

symbol_name

[in] Символ.

timeframe

[in] Период.

prop_id

[in] Идентификатор запрашиваемого свойства, значение перечисления ENUM_SERIES_INFO_INTEGER.

long_var

[out] Переменная, в которую помещается значение запрошенного свойства.

Возвращаемое значение

Значение типа long для первого варианта вызова.

Для второго варианта вызова возвращает true, если данное свойство поддерживается и значение было помещено в переменную long_var, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

void OnStart()
{
//---
Print("Количество баров по символу-периоду на данный момент = ",
SeriesInfoInteger(Symbol(),0,SERIES_BARS_COUNT));

Print("Самая первая дата по символу-периоду на данный момент = ",
(datetime)SeriesInfoInteger(Symbol(),0,SERIES_FIRSTDATE));

Print("Самая первая дата в истории по символу на сервере = ",
(datetime)SeriesInfoInteger(Symbol(),0,SERIES_SERVER_FIRSTDATE));
}


RefreshRates

Справочник MQL4 / Доступ к таймсериям и индикаторам / RefreshRates

RefreshRates

Осуществляет обновление данных в предопределенных переменных и массивах-таймсериях.

bool RefreshRates();

Параметры

Нет.

Возвращаемое значение

Возвращает true, если данные обновлены, иначе false.

Примечание

Эта функция используется, когда эксперт или скрипт производит вычисления в течение долгого времени и нуждается в обновленных данных.

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

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

Пример:

int ticket;
while(true)
{
ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0,"комментарий эксперта",255,0,CLR_NONE);
if(ticket<=0)
{
int error=GetLastError();
//---- недостаточно денег
if(error==134) break;
//---- 10 секунд ожидания
Sleep(10000);
//---- обновим ценовые данные
RefreshRates();
}
else
{
OrderSelect(ticket,SELECT_BY_TICKET);
OrderPrint();
break;
}
}


CopyRates

Справочник MQL4 / Доступ к таймсериям и индикаторам / CopyRates

CopyRates

Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар.

При копировании заранее неизвестного количества данных рекомендуется в качестве приемного массива использовать динамический массив, так как если данных оказывается меньше (или больше), чем вмещает массив, то производится попытка перераспределения массива таким образом, чтобы запрошенные данные поместились целиком и полностью.

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

Неважно, какое свойство имеет приемный массив - as_series=true или as_series=false, данные будут скопированы таким образом, что самый старый по времени элемент будет в начале физической памяти, отведенной под массив. Существует 3 варианта функции.

Обращение по начальной позиции и количеству требуемых элементов

int CopyRates(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
int start_pos, // откуда начнем
int count, // сколько копируем
MqlRates rates_array[] // массив, куда будут скопированы данные
);

Обращение по начальной дате и количеству требуемых элементов

int CopyRates(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
int count, // сколько копируем
MqlRates rates_array[] // массив, куда будут скопированы данные
);

Обращение по начальной и конечной датам требуемого интервала времени

int CopyRates(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
datetime stop_time, // по какую дату
MqlRates rates_array[] // массив, куда будут скопированы данные
);

Параметры

symbol_name

[in] Символ.

timeframe

[in] Период.

start_time

[in] Время бара, соответствующее первому элементу.

start_pos

[in] Номер первого копируемого элемента.

count

[in] Количество копируемых элементов.

stop_time

[in] Время бара, соответствующее последнему элементу.

rates_array[]

[out] Массив типа MqlRates.

Возвращаемое значение

Количество скопированных элементов массива либо -1 в случае ошибки.

Примечание

Если интервал запрашиваемых данных полностью находится вне доступных данных на сервере, то функция возвращает -1. В случае если запрашиваются данные за пределами TERMINAL_MAXBARS (максимальное количество баров на графике), функция также вернет -1.

Если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, то функция сразу же вернет -1.

При запросе данных по начальной дате и количеству требуемых элементов возвращаются только данные, дата которых меньше (раньше) или равна указанной. При этом интервал задается и учитывается с точностью до секунды. То есть дата открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда равна или меньше указанной.

При запросе данных в заданном диапазоне дат возвращаются только данные, попадающие в запрашиваемый интервал, при этом интервал задается и учитывается с точностью до секунды. То есть время открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда находится в запрошенном интервале.

Таким образом, если текущий день недели Суббота, то при попытке скопировать данные на недельном таймфрейме с указанием start_time=Последний_Вторник и stop_time=Последняя_Пятница функция вернет 0, так как время открытия на недельном таймфрейме всегда приходится на воскресенье, но ни один недельный бар не попадает в указанный диапазон.

Если необходимо получить значение, соответствующее текущему незавершенному бару, то можно использовать первую форму вызова с указанием start_pos=0 и count=1.

Пример:

void OnStart()
{
//---
MqlRates rates[];
ArraySetAsSeries(rates,true);
int copied=CopyRates(Symbol(),0,0,100,rates);
if(copied>0)
{
Print("Скопировано баров: "+copied);
string format="open = %G, high = %G, low = %G, close = %G, volume = %d";
string out;
int size=fmin(copied,10);
for(int i=0;i<size;i++)
{
out=i+":"+TimeToString(rates[i].time);
out=out+" "+StringFormat(format,
rates[i].open,
rates[i].high,
rates[i].low,
rates[i].close,
rates[i].tick_volume);
Print(out);
}
}
else Print("Не удалось получить исторические данные по символу ",Symbol());
}

Смотри также

Структуры и классы, TimeToString, StringFormat


CopyTime

Справочник MQL4 / Доступ к таймсериям и индикаторам / CopyTime

CopyTime

Функция получает в массив time_array исторические данные времени открытия баров для указанной пары символ-период в указанном количестве. Необходимо отметить, что отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар.

При копировании заранее неизвестного количества данных рекомендуется в качестве приемного массива использовать динамический массив, так как если данных оказывается меньше (или больше), чем вмещает массив, то производится попытка перераспределения массива таким образом, чтобы запрошенные данные поместились целиком и полностью.

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

Неважно, какое свойство имеет приемный массив - as_series=true или as_series=false, данные будут скопированы таким образом, что самый старый по времени элемент будет в начале физической памяти, отведенной под массив. Существует 3 варианта функции.

Обращение по начальной позиции и количеству требуемых элементов

int CopyTime(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
int start_pos, // откуда начнем
int count, // сколько копируем
datetime time_array[] // массив для копирования времени открытия
);

Обращение по начальной дате и количеству требуемых элементов

int CopyTime(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
int count, // сколько копируем
datetime time_array[] // массив для копирования времени открытия
);

Обращение по начальной и конечной датам требуемого интервала времени

int CopyTime(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
datetime stop_time, // по какую дату
datetime time_array[] // массив для копирования времени открытия
);

Параметры

symbol_name

[in] Символ.

timeframe

[in] Период.

start_pos

[in] Номер первого копируемого элемента.

count

[in] Количество копируемых элементов.

start_time

[in] Время бара, соответствующее первому элементу.

stop_time

[in] Время бара, соответствующее последнему элементу.

time_array[]

[out] Массив типа datetime.

Возвращаемое значение

Количество скопированных элементов массива либо -1 в случае ошибки.

Примечание

Если интервал запрашиваемых данных полностью находится вне доступных данных на сервере, то функция возвращает -1. В случае если запрашиваются данные за пределами TERMINAL_MAXBARS (максимальное количество баров на графике), функция также вернет -1.

Если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, функция сразу же вернет -1, но при этом сам процесс загрузки/построения будет инициирован.

При запросе данных по начальной дате и количеству требуемых элементов возвращаются только данные, дата которых меньше (раньше) или равна указанной. При этом интервал задается и учитывается с точностью до секунды. То есть дата открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда равна или меньше указанной.

При запросе данных в заданном диапазоне дат возвращаются только данные, попадающие в запрашиваемый интервал, при этом интервал задается и учитывается с точностью до секунды. То есть время открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time) всегда находится в запрошенном интервале.

Таким образом, если текущий день недели Суббота, то при попытке скопировать данные на недельном таймфрейме с указанием start_time=Последний_Вторник и stop_time=Последняя_Пятница функция вернет 0, так как время открытия на недельном таймфрейме всегда приходится на воскресенье, но ни один недельный бар не попадает в указанный диапазон.

Если необходимо получить значение, соответствующее текущему незавершенному бару, то можно использовать первую форму вызова с указанием start_pos=0 и count=1.


CopyOpen

Справочник MQL4 / Доступ к таймсериям и индикаторам / CopyOpen

CopyOpen

Функция получает в массив open_array исторические данные цен открытия баров для указанной пары символ-период в указанном количестве. Необходимо отметить, что отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар.

При копировании заранее неизвестного количества данных рекомендуется в качестве приемного массива использовать динамический массив, так как если данных оказывается меньше (или больше), чем вмещает массив, то производится попытка перераспределения массива таким образом, чтобы запрошенные данные поместились целиком и полностью.

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

Неважно, какое свойство имеет приёмный массив - as_series=true или as_series=false, данные будут скопированы таким образом, что самый старый по времени элемент будет в начале физической памяти, отведенной под массив. Существует 3 варианта функции.

Обращение по начальной позиции и количеству требуемых элементов

int CopyOpen(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
int start_pos, // откуда начнем
int count, // сколько копируем
double open_array[] // массив для копирования цен открытия
);

Обращение по начальной дате и количеству требуемых элементов

int CopyOpen(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
int count, // сколько копируем
double open_array[] // массив для копирования цен открытия
);

Обращение по начальной и конечной датам требуемого интервала времени

int CopyOpen(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
datetime stop_time, // по какую дату
double open_array[] // массив для копирования цен открытия
);

Параметры

symbol_name

[in] Символ.

timeframe

[in] Период.

start_pos

[in] Номер первого копируемого элемента.

count

[in] Количество копируемых элементов.

start_time

[in] Время бара, соответствующее первому элементу.

stop_time

[in] Время бара, соответствующее последнему элементу.

open_array[]

[out] Массив типа double.

Возвращаемое значение

Количество скопированных элементов массива либо -1 в случае ошибки.

Примечание

Если интервал запрашиваемых данных полностью находится вне доступных данных на сервере, то функция возвращает -1. В случае если запрашиваются данные за пределами TERMINAL_MAXBARS (максимальное количество баров на графике), функция также вернет -1.

Если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, функция сразу же вернет -1.

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

При запросе данных по начальной дате и количеству требуемых элементов возвращаются только данные, дата которых меньше (раньше) или равна указанной. При этом интервал задается и учитывается с точностью до секунды. То есть дата открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда равна или меньше указанной.

При запросе данных в заданном диапазоне дат возвращаются только данные, попадающие в запрашиваемый интервал, при этом интервал задается и учитывается с точностью до секунды. То есть время открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда находится в запрошенном интервале.

Таким образом, если текущий день недели Суббота, то при попытке скопировать данные на недельном таймфрейме с указанием start_time=Последний_Вторник и stop_time=Последняя_Пятница функция вернет 0, так как время открытия на недельном таймфрейме всегда приходится на воскресенье, но ни один недельный бар не попадает в указанный диапазон.

Если необходимо получить значение, соответствующее текущему незавершенному бару, то можно использовать первую форму вызова с указанием start_pos=0 и count=1.


CopyHigh

Справочник MQL4 / Доступ к таймсериям и индикаторам / CopyHigh

CopyHigh

Функция получает в массив high_array исторические данные максимальных цен баров для указанной пары символ-период в указанном количестве. Необходимо отметить, что отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар.

При копировании заранее неизвестного количества данных рекомендуется в качестве приемного массива использовать динамический массив, так как если данных оказывается меньше (или больше), чем вмещает массив, то производится попытка перераспределения массива таким образом, чтобы запрошенные данные поместились целиком и полностью.

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

Неважно, какое свойство имеет приемный массив - as_series=true или as_series=false, данные будут скопированы таким образом, что самый старый по времени элемент будет в начале физической памяти, отведенной под массив. Существует 3 варианта функции.

Обращение по начальной позиции и количеству требуемых элементов

int CopyHigh(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
int start_pos, // откуда начнем
int count, // сколько копируем
double high_array[] // массив для копирования максимальных цен
);

Обращение по начальной дате и количеству требуемых элементов

int CopyHigh(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
int count, // сколько копируем
double high_array[] // массив для копирования максимальных цен
);

Обращение по начальной и конечной датам требуемого интервала времени

int CopyHigh(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
datetime stop_time, // по какую дату
double high_array[] // массив для копирования максимальных цен
);

Параметры

symbol_name

[in] Символ.

timeframe

[in] Период.

start_pos

[in] Номер первого копируемого элемента.

count

[in] Количество копируемых элементов.

start_time

[in] Время бара, соответствующее первому элементу.

stop_time

[in] Время бара, соответствующее последнему элементу.

high_array[]

[out] Массив типа double.

Возвращаемое значение

Количество скопированных элементов массива либо -1 в случае ошибки.

Примечание

Если интервал запрашиваемых данных полностью находится вне доступных данных на сервере, то функция возвращает -1. В случае, если запрашиваются данные за пределами TERMINAL_MAXBARS (максимальное количество баров на графике), то функция также вернет -1.

Если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, то функция сразу же вернет -1.

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

При запросе данных по начальной дате и количеству требуемых элементов возвращаются только данные, дата которых меньше (раньше) или равна указанной. При этом интервал задается и учитывается с точностью до секунды. То есть дата открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда равна или меньше указанной.

При запросе данных в заданном диапазоне дат возвращаются только данные, попадающие в запрашиваемый интервал, при этом интервал задается и учитывается с точностью до секунды. То есть, время открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time) всегда находится в запрошенном интервале.

Таким образом, если текущий день недели Суббота, то при попытке скопировать данные на недельном таймфрейме с указанием start_time=Последний_Вторник и stop_time=Последняя_Пятница функция вернет 0, так как время открытия на недельном таймфрейме всегда приходится на воскресенье, но ни один недельный бар не попадает в указанный диапазон.

Если необходимо получить значение, соответствующее текущему незавершенному бару, то можно использовать первую форму вызова с указанием start_pos=0 и count=1.

Пример:

#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"

#property description "Пример вывода значений High[i] и Low[i]"
#property description "для баров, выбранных случайным образом"

double High[],Low[];
//+------------------------------------------------------------------+
//| Получим Low для заданного номера бара |
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double low=0;
ArraySetAsSeries(Low,true);
int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
if(copied>0 && index<copied) low=Low[index];
return(low);
}
//+------------------------------------------------------------------+
//| Получим High для заданного номера бара |
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- выводим на каждом тике значения High и Low для бара с индексом,
//--- равным секунде поступления тика
datetime t=TimeCurrent();
int sec=t%60;
printf("High[%d] = %G Low[%d] = %G",
sec,iHigh(Symbol(),0,sec),
sec,iLow(Symbol(),0,sec));
}


CopyLow

Справочник MQL4 / Доступ к таймсериям и индикаторам / CopyLow

CopyLow

Функция получает в массив low_array исторические данные минимальных цен баров для указанной пары символ-период в указанном количестве. Необходимо отметить, что отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар.

При копировании заранее неизвестного количества данных рекомендуется в качестве приемного массива использовать динамический массив, так как если данных оказывается меньше (или больше), чем вмещает массив, то производится попытка перераспределения массива таким образом, чтобы запрошенные данные поместились целиком и полностью.

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

Неважно, какое свойство имеет приемный массив - as_series=true или as_series=false, данные будут скопированы таким образом, что самый старый по времени элемент будет в начале физической памяти, отведенной под массив. Существует 3 варианта функции.

Обращение по начальной позиции и количеству требуемых элементов

int CopyLow(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
int start_pos, // откуда начнем
int count, // сколько копируем
double low_array[] // массив для копирования минимальных цен
);

Обращение по начальной дате и количеству требуемых элементов

int CopyLow(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
int count, // сколько копируем
double low_array[] // массив для копирования минимальных цен
);

Обращение по начальной и конечной датам требуемого интервала времени

int CopyLow(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
datetime stop_time, // по какую дату
double low_array[] // массив для копирования минимальных цен
);

Параметры

symbol_name

[in] Символ.

timeframe

[in] Период.

start_pos

[in] Номер первого копируемого элемента.

count

[in] Количество копируемых элементов.

start_time

[in] Время бара, соответствующее первому элементу.

stop_time

[in] Время бара, соответствующее последнему элементу.

low_array[]

[out] Массив типа double.

Возвращаемое значение

Количество скопированных элементов массива либо -1 в случае ошибки.

Примечание

Если интервал запрашиваемых данных полностью находится вне доступных данных на сервере, то функция возвращает -1. В случае если запрашиваются данные за пределами TERMINAL_MAXBARS (максимальное количество баров на графике), функция также вернет -1.

Если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, функция сразу же вернет -1.

При запросе данных по начальной дате и количеству требуемых элементов возвращаются только данные, дата которых меньше (раньше) или равна указанной. При этом интервал задается и учитывается с точностью до секунды. То есть дата открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда равна или меньше указанной.

При запросе данных в заданном диапазоне дат возвращаются только данные, попадающие в запрашиваемый интервал, при этом интервал задается и учитывается с точностью до секунды. То есть время открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда находится в запрошенном интервале.

Таким образом, если текущий день недели Суббота, то при попытке скопировать данные на недельном таймфрейме с указанием start_time=Последний_Вторник и stop_time=Последняя_Пятница функция вернет 0, так как время открытия на недельном таймфрейме всегда приходится на воскресенье, но ни один недельный бар не попадает в указанный диапазон.

Если необходимо получить значение, соответствующее текущему незавершенному бару, то можно использовать первую форму вызова с указанием start_pos=0 и count=1.

Смотри также

CopyHigh


CopyClose

Справочник MQL4 / Доступ к таймсериям и индикаторам / CopyClose

CopyClose

Функция получает в массив close_array исторические данные цен закрытия баров для указанной пары символ-период в указанном количестве. Необходимо отметить, что отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар.

При копировании заранее неизвестного количества данных рекомендуется в качестве приемного массива использовать динамический массив, так как если данных оказывается меньше (или больше), чем вмещает массив, то производится попытка перераспределения массива таким образом, чтобы запрошенные данные поместились целиком и полностью.

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

Неважно, какое свойство имеет приемный массив - as_series=true или as_series=false, данные будут скопированы таким образом, что самый старый по времени элемент будет в начале физической памяти, отведенной под массив. Существует 3 варианта функции.

Обращение по начальной позиции и количеству требуемых элементов

int CopyClose(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
int start_pos, // откуда начнем
int count, // сколько копируем
double close_array[] // массив для копирования цен закрытия
);

Обращение по начальной дате и количеству требуемых элементов

int CopyClose(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
int count, // сколько копируем
double close_array[] // массив для копирования цен закрытия
);

Обращение по начальной и конечной датам требуемого интервала времени

int CopyClose(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
datetime stop_time, // по какую дату
double close_array[] // массив для копирования цен закрытия
);

Параметры

symbol_name

[in] Символ.

timeframe

[in] Период.

start_pos

[in] Номер первого копируемого элемента.

count

[in] Количество копируемых элементов.

start_time

[in] Время бара, соответствующее первому элементу.

stop_time

[in] Время бара, соответствующее последнему элементу.

close_array[]

[out] Массив типа double.

Возвращаемое значение

Количество скопированных элементов массива либо -1 в случае ошибки.

Примечание

Если интервал запрашиваемых данных полностью находится вне доступных данных на сервере, то функция возвращает -1. В случае если запрашиваются данные за пределами TERMINAL_MAXBARS (максимальное количество баров на графике), функция также вернет -1.

Если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, функция сразу же вернет -1.

При запросе данных по начальной дате и количеству требуемых элементов возвращаются только данные, дата которых меньше (раньше) или равна указанной. При этом интервал задается и учитывается с точностью до секунды. То есть дата открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда равна или меньше указанной.

При запросе данных в заданном диапазоне дат возвращаются только данные, попадающие в запрашиваемый интервал, при этом интервал задается и учитывается с точностью до секунды. То есть время открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда находится в запрошенном интервале.

Таким образом, если текущий день недели Суббота, то при попытке скопировать данные на недельном таймфрейме с указанием start_time=Последний_Вторник и stop_time=Последняя_Пятница функция вернет 0, так как время открытия на недельном таймфрейме всегда приходится на воскресенье, но ни один недельный бар не попадает в указанный диапазон.

Если необходимо получить значение, соответствующее текущему незавершенному бару, то можно использовать первую форму вызова с указанием start_pos=0 и count=1.


CopyTickVolume

Справочник MQL4 / Доступ к таймсериям и индикаторам / CopyTickVolume

CopyTickVolume

Функция получает в массив volume_array исторические данные тиковых объемов для указанной пары символ-период в указанном количестве. Необходимо отметить, что отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар.

При копировании заранее неизвестного количества данных рекомендуется в качестве приемного массива использовать динамический массив, так как если данных оказывается меньше (или больше), чем вмещает массив, то производится попытка перераспределения массива таким образом, чтобы запрошенные данные поместились целиком и полностью.

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

Неважно, какое свойство имеет приемный массив - as_series=true или as_series=false, данные будут скопированы таким образом, что самый старый по времени элемент будет в начале физической памяти, отведенной под массив. Существует 3 варианта функции.

Обращение по начальной позиции и количеству требуемых элементов

int CopyTickVolume(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
int start_pos, // откуда начнем
int count, // сколько копируем
long volume_array[] // массив для копирования тиковых объемов
);

Обращение по начальной дате и количеству требуемых элементов

int CopyTickVolume(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
int count, // сколько копируем
long volume_array[] // массив для копирования тиковых объемов
);

Обращение по начальной и конечной датам требуемого интервала времени

int CopyTickVolume(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
datetime stop_time, // по какую дату
long volume_array[] // массив для копирования тиковых объемов
);

Параметры

symbol_name

[in] Символ.

timeframe

[in] Период.

start_pos

[in] Номер первого копируемого элемента.

count

[in] Количество копируемых элементов.

start_time

[in] Время бара, соответствующее первому элементу.

stop_time

[in] Время бара, соответствующее последнему элементу.

volume_array[]

[out] Массив типа long.

Возвращаемое значение

Количество скопированных элементов массива либо -1 в случае ошибки.

Примечание

Если интервал запрашиваемых данных полностью находится вне доступных данных на сервере, то функция возвращает -1. В случае если запрашиваются данные за пределами TERMINAL_MAXBARS (максимальное количество баров на графике), функция также вернет -1.

Если запрашиваемые таймсерии еще не построены или их необходимо загрузить с сервера, функция сразу же вернет -1.

При запросе данных по начальной дате и количеству требуемых элементов возвращаются только данные, дата которых меньше (раньше) или равна указанной. При этом интервал задается и учитывается с точностью до секунды. То есть дата открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда равна или меньше указанной.

При запросе данных в заданном диапазоне дат возвращаются только данные, попадающие в запрашиваемый интервал, при этом интервал задается и учитывается с точностью до секунды. То есть время открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда находится в запрошенном интервале.

Таким образом, если текущий день недели Суббота, то при попытке скопировать данные на недельном таймфрейме с указанием start_time=Последний_Вторник и stop_time=Последняя_Пятница функция вернет 0, так как время открытия на недельном таймфрейме всегда приходится на воскресенье, но ни один недельный бар не попадает в указанный диапазон.

Если необходимо получить значение, соответствующее текущему незавершенному бару, то можно использовать первую форму вызова с указанием start_pos=0 и count=1.

Пример:

#property strict
#property indicator_separate_window
#property indicator_buffers 1
//---- plot TickVolume
#property indicator_label1 "TickVolume"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 C'143,188,139'
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- input parameters
input int bars=3000;
//--- indicator buffers
double TickVolumeBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,TickVolumeBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
if(prev_calculated==0)
{
long timeseries[];
ArraySetAsSeries(timeseries,true);
int copied=CopyTickVolume(Symbol(),0,0,bars,timeseries);
for(int i=rates_total-copied-1;i>copied-1;i--) TickVolumeBuffer[i]=0.0;
for(int i=0;i<copied;i++) TickVolumeBuffer[i]=(double)timeseries[i];
Print("Получено исторических значений TickVolume: "+(string)copied);
}
else
{
long timeseries[];
int copied=CopyTickVolume(Symbol(),0,0,1,timeseries);
TickVolumeBuffer[0]=(double)timeseries[0];
}
//--- return value of prev_calculated for next call
return(rates_total);
}


Bars

Справочник MQL4 / Доступ к таймсериям и индикаторам / Bars

Bars

Возвращает количество баров в истории по соответствующему символу периоду. Существует 2 варианта функции.

Запросить количество всех баров в истории

int Bars(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe // периоду
);

Запросить количество баров на заданном интервале

int Bars(
string symbol_name, // имя символа
ENUM_TIMEFRAMES timeframe, // период
datetime start_time, // с какой даты
datetime stop_time // по какую дату
);

Параметры

symbol_name

[in] Символ.

timeframe

[in] Период.

start_time

[in] Время бара, соответствующее первому элементу.

stop_time

[in] Время бара, соответствующее последнему элементу.

Возвращаемое значение

Если указаны параметры start_time и stop_time, то функция возвращает количество баров в диапазоне дат. Если эти параметры не указаны, то функция возвращает общее количество баров.

Примечание

Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не синхронизированы с торговым сервером, то функция вернет нулевое значение.

Смотри также

Предопределенная переменная Bars, iBars


iBars

Справочник MQL4 / Доступ к таймсериям и индикаторам / iBars

iBars

Возвращает количество баров в истории по соответствующему символу и периоду.

int iBars(
string symbol, // символ
int timeframe // период
);

Параметры

symbol

[in] Символьное имя инструмента. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

Возвращаемое значение

Количество баров в истории по соответствующему символу и периоду.

Примечание

Для текущего графика информация о количестве баров находится в предопределенной переменной Bars.

Пример:

Print("Bar count on the 'EURUSD,H1' is ",iBars("EURUSD",PERIOD_H1));


iBarShift

Справочник MQL4 / Доступ к таймсериям и индикаторам / iBarShift

iBarShift

Поиск бара по времени. Функция возвращает индекс бара, в который попадает указанное время.

int iBarShift(
string symbol, // символ
int timeframe, // период
datetime time, // время
bool exact=false // режим
);

Параметры

symbol

[in] Символьное имя инструмента. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

time

[in] Значение времени для поиска.

exact=false

[in] Возвращаемое значение, если бар не найден. Если exact=false, iBarShift возвращает ближайший, если exact=true, iBarShift возвращает -1.

Возвращаемое значение

Индекс бара, в который попадает указанное время. Если для указанного времени бар отсутствует ("дыра" в истории), то функция возвращает -1 или индекс ближайшего бара (в зависимости от параметра exact).

Пример:

datetime some_time=D'2004.03.21 12:00';
int shift=iBarShift("EURUSD",PERIOD_M1,some_time);
Print("index of the bar for the time ",TimeToStr(some_time)," is ",shift);


iClose

Справочник MQL4 / Доступ к таймсериям и индикаторам / iClose

iClose

Возвращает значение цены закрытия бара (указанного параметром shift) соответствующего графика.

double iClose(
string symbol, // символ
int timeframe, // период
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

shift

[in] Индекс получаемого значения из таймсерии (сдвиг относительно текущего бара на указанное количество баров назад).

Возвращаемое значение

Значение цены закрытия бара (указанного параметром shift) соответствующего графика или 0 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Примечание

Для текущего графика информация о ценах закрытия баров находится в предопределенном массиве Close[].

Пример:

Print("Current bar for USDCHF H1: ",iTime("USDCHF",PERIOD_H1,0),", ", iOpen("USDCHF",PERIOD_H1,0),", ",
iHigh("USDCHF",PERIOD_H1,0),", ", iLow("USDCHF",PERIOD_H1,0),", ",
iClose("USDCHF",PERIOD_H1,0),", ", iVolume("USDCHF",PERIOD_H1,0));


iHigh

Справочник MQL4 / Доступ к таймсериям и индикаторам / iHigh

iHigh

Возвращает значение максимальной цены бара (указанного параметром shift) соответствующего графика.

double iHigh(
string symbol, // символ
int timeframe, // период
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

shift

[in] Индекс получаемого значения из таймсерии (сдвиг относительно текущего бара на указанное количество баров назад).

Возвращаемое значение

Значение максимальной цены бара (указанного параметром shift) соответствующего графика или 0 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Примечание

Для текущего графика информация о максимальных ценах баров находится в предопределенном массиве High[].

Пример:

Print("Current bar for USDCHF H1: ",iTime("USDCHF",PERIOD_H1,0),", ", iOpen("USDCHF",PERIOD_H1,0),", ",
iHigh("USDCHF",PERIOD_H1,0),", ", iLow("USDCHF",PERIOD_H1,0),", ",
iClose("USDCHF",PERIOD_H1,0),", ", iVolume("USDCHF",PERIOD_H1,0));


iHighest

Справочник MQL4 / Доступ к таймсериям и индикаторам / iHighest

iHighest

Возвращает индекс наибольшего найденного значения (смещение относительно текущего бара) соответствующего графика.

int iHighest(
string symbol, // символ
int timeframe, // период
int type, // идентификатор таймсерии
int count, // число элементов
int start // индекс
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет производиться поиск. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

type

[in] Идентификатор таймсерии, в которой будет производится поиск. Может быть любым из значений иденитификаторов таймсерий.

count=WHOLE_ARRAY

[in] Число элементов таймсерии (в направлении от текущего бара в сторону возрастания индекса), среди которых должен быть произведен поиск.

start=0

[in] Индекс (смещение относительно текущего бара) начального бара, с которого начинается поиск наибольшего значения. Отрицательные значения игнорируются и заменяются нулевым значением.

Возвращаемое значение

Индекс наибольшего найденного значения (смещение относительно текущего бара) соответствующего графика или -1 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Пример:

double val;
//--- расчет максимального значения цены на 20 последовательных барах
//--- с индекса 4 по индекс 23 включительно на текущем графике
int val_index=iHighest(NULL,0,MODE_HIGH,20,4);
if(val_index!=-1) val=High[val_index];
else PrintFormat("Ошибка вызова iHighest. Код ошибки=%d",GetLastError());


iLow

Справочник MQL4 / Доступ к таймсериям и индикаторам / iLow

iLow

Возвращает значение минимальной цены бара (указанного параметром shift) соответствующего графика.

double iLow(
string symbol, // символ
int timeframe, // период
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

shift

[in] Индекс получаемого значения из таймсерии (сдвиг относительно текущего бара на указанное количество баров назад).

Возвращаемое значение

Значение минимальной цены бара (указанного параметром shift) соответствующего графика или 0 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Примечание

Для текущего графика информация о минимальных ценах баров находится в предопределенном массиве Low[].

Пример:

Print("Current bar for USDCHF H1: ",iTime("USDCHF",PERIOD_H1,0),", ", iOpen("USDCHF",PERIOD_H1,0),", ",
iHigh("USDCHF",PERIOD_H1,0),", ", iLow("USDCHF",PERIOD_H1,0),", ",
iClose("USDCHF",PERIOD_H1,0),", ", iVolume("USDCHF",PERIOD_H1,0));


iLowest

Справочник MQL4 / Доступ к таймсериям и индикаторам / iLowest

iLowest

Возвращает индекс наименьшего найденного значения (смещение относительно текущего бара) соответствующего графика.

int iLowest(
string symbol, // символ
int timeframe, // период
int type, // идентификатор таймсерии
int count, // число элементов
int start // индекс
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет производиться поиск. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

type

[in] Идентификатор таймсерии, в которой будет производится поиск. Может быть любым из значений иденитификаторов таймсерий.

count=WHOLE_ARRAY

[in] Число элементов таймсерии (в направлении от текущего бара в сторону возрастания индекса), среди которых должен быть произведен поиск.

start=0

[in] Индекс (смещение относительно текущего бара) начального бара, с которого начинается поиск наименьшего значения. Отрицательные значения игнорируются и заменяются нулевым значением.

Возвращаемое значение

Индекс наименьшего найденного значения (смещение относительно текущего бара) соответствующего графика или -1 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Пример:

double val;
//--- расчет минимального значения цены на 10 последовательных барах
//--- с индекса 10 по индекс 19 включительно на текущем графике
int val_index=iLowest(NULL,0,MODE_LOW,10,10);
if(val_index!=-1) val=Low[val_index];
else PrintFormat("Ошибка вызова iLowest. Код ошибки=%d",GetLastError());


iOpen

Справочник MQL4 / Доступ к таймсериям и индикаторам / iOpen

iOpen

Возвращает значение цены открытия бара (указанного параметром shift) соответствующего графика.

double iOpen(
string symbol, // символ
int timeframe, // период
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

shift

[in] Индекс получаемого значения из таймсерии (сдвиг относительно текущего бара на указанное количество баров назад).

Возвращаемое значение

Значение минимальной цены бара (указанного параметром shift) соответствующего графика или 0 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Примечание

Для текущего графика информация о ценах открытия баров находится в предопределенном массиве Open[].

Пример:

Print("Current bar for USDCHF H1: ",iTime("USDCHF",PERIOD_H1,0),", ", iOpen("USDCHF",PERIOD_H1,0),", ",
iHigh("USDCHF",PERIOD_H1,0),", ", iLow("USDCHF",PERIOD_H1,0),", ",
iClose("USDCHF",PERIOD_H1,0),", ", iVolume("USDCHF",PERIOD_H1,0));


iTime

Справочник MQL4 / Доступ к таймсериям и индикаторам / iTime

iTime

Возвращает значение времени открытия бара (указанного параметром shift) соответствующего графика.

datetime iTime(
string symbol, // символ
int timeframe, // период
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

shift

[in] Индекс получаемого значения из таймсерии (сдвиг относительно текущего бара на указанное количество баров назад).

Возвращаемое значение

Значение времени открытия бара (указанного параметром shift) соответствующего графика или 0 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Примечание

Для текущего графика информация о времени открытия баров находится в предопределенном массиве Time[].

Пример:

Print("Current bar for USDCHF H1: ",iTime("USDCHF",PERIOD_H1,0),", ", iOpen("USDCHF",PERIOD_H1,0),", ",
iHigh("USDCHF",PERIOD_H1,0),", ", iLow("USDCHF",PERIOD_H1,0),", ",
iClose("USDCHF",PERIOD_H1,0),", ", iVolume("USDCHF",PERIOD_H1,0));


iVolume

Справочник MQL4 / Доступ к таймсериям и индикаторам / iVolume

iVolume

Возвращает значение тикового объема бара (указанного параметром shift) соответствующего графика.

long iVolume(
string symbol, // символ
int timeframe, // период
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

shift

[in] Индекс получаемого значения из таймсерии (сдвиг относительно текущего бара на указанное количество баров назад).

Возвращаемое значение

Значение тикового объема бара (указанного параметром shift) соответствующего графика или 0 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Примечание

Для текущего графика информация о тиковых объемах баров находится в предопределенном массиве Volume[].

Пример:

Print("Current bar for USDCHF H1: ",iTime("USDCHF",PERIOD_H1,0),", ", iOpen("USDCHF",PERIOD_H1,0),", ",
iHigh("USDCHF",PERIOD_H1,0),", ", iLow("USDCHF",PERIOD_H1,0),", ",
iClose("USDCHF",PERIOD_H1,0),", ", iVolume("USDCHF",PERIOD_H1,0));


Операции с графиками

Справочник MQL4 / Операции с графиками

Операции с графиками

Функции для работы с графиками. Все операции с графиками применимы только в экспертах и скриптах.

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

По этой причине не следует ожидать немедленного визуального обновления графика после вызова данных функций. В общем случае обновление графика производится терминалом автоматически по событиям изменения - поступление новой котировки, изменения размера окна графика и т.д. Для принудительного обновления внешнего вида графика используйте команду на перерисовку графика ChartRedraw().

Функция | Действие
ChartApplyTemplate | Применяет к указанному графику шаблон из указанного файла
ChartSaveTemplate | Сохраняет текущие настройки графика в шаблон с указанным именем
ChartWindowFind | Возвращает номер подокна, в котором находится индикатор
ChartTimePriceToXY | Преобразует координаты графика из представления время/цена в координаты по оси X и Y
ChartXYToTimePrice | Преобразует координаты X и Y графика в значения время и цена
ChartOpen | Открывает новый график с указанным символом и периодом
ChartFirst | Возвращает идентификатор первого графика клиентского терминала
ChartNext | Возвращает идентификатор графика, следующего за указанным
ChartClose | Закрывает указанный график
ChartSymbol | Возвращает имя символа указанного графика
ChartPeriod | Возвращает значение периода указанного графика
ChartRedraw | Вызывает принудительную перерисовку указанного графика
ChartSetDouble | Задает значение типа double соответствующего свойства указанного графика
ChartSetInteger | Задает значение целочисленного типа (datetime, int, color, bool или char) соответствующего свойства указанного графика
ChartSetString | Задает значение типа string соответствующего свойства указанного графика
ChartGetDouble | Возвращает значение соответствующего свойства указанного графика
ChartGetInteger | Возвращает целочисленное значение соответствующего свойства указанного графика
ChartGetString | Возвращает строковое значение соответствующего свойства указанного графика
ChartNavigate | Осуществляет сдвиг указанного графика на указанное количество баров относительно указанной позиции графика
ChartID | Возвращает идентификатор текущего графика
ChartIndicatorDelete | Удаляет с указанного окна графика индикатор с указанным именем
ChartIndicatorName | Возвращает короткое имя индикатора по номеру в списке индикаторов на указанном окне графика.
ChartIndicatorsTotal | Возвращает количество всех индикаторов, присоединенных к указанному окну графика.
ChartWindowOnDropped | Возвращает номер подокна графика, на которое брошен мышкой данный эксперт, скрипт, объект или индикатор
ChartPriceOnDropped | Возвращает ценовую координату, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт
ChartTimeOnDropped | Возвращает временную координату, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт
ChartXOnDropped | Возвращает координату по оси X, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт
ChartYOnDropped | Возвращает координату по оси Y, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт
ChartSetSymbolPeriod | Меняет значения символа и периода указанного графика
ChartScreenShot | Делает снимок указанного графика в формате gif
Period | Возвращает период текущего графика
Symbol | Возвращает текстовую строку с именем текущего финансового инструмента
WindowBarsPerChart | Возвращает количество баров, помещающихся в окно текущего графика
WindowExpertName | Возвращает имя выполняющегося эксперта, скрипта, пользовательского индикатора или библиотеки
WindowFind | Возвращает номер подокна графика, содержащего индикатор с указанным именем
WindowFirstVisibleBar | Возвращает номер первого видимого бара в окне текущего графика
WindowHandle | Возвращает системный дескриптор окна, содержащего указанный график
WindowIsVisible | Возвращает состояние видимости подокна графика
WindowOnDropped | Возвращает индекс окна, в которое был брошен эксперт, пользовательский индикатор или скрипт
WindowPriceMax | Возвращает максимальное значение вертикальной шкалы указанного подокна текущего графика
WindowPriceMin | Возвращает минимальное значение вертикальной шкалы указанного подокна текущего графика
WindowPriceOnDropped | Возвращает значение цены в точке графика, на который был брошен эксперт или скрипт
WindowRedraw | Принудительно перерисовывает текущий график
WindowScreenShot | Сохраняет изображение текущего графика в файле формата GIF, PNG или BMP в зависимости от указанного расширения
WindowTimeOnDropped | Возвращает значение времени в точке графика, на который был брошен эксперт или скрипт
WindowsTotal | Возвращает количество окон индикаторов на графике, включая главное окно графика
WindowXOnDropped | Возвращает значение координаты по оси X в пикселах точки клиентской области окна графика, на которой был брошен эксперт или скрипт
WindowYOnDropped | Возвращает значение координаты по оси Y в пикселах точки клиентской области окна графика, на которой был брошен эксперт или скрипт


ChartApplyTemplate

Справочник MQL4 / Операции с графиками / ChartApplyTemplate

ChartApplyTemplate

Применяет к графику указанный шаблон. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.

bool ChartApplyTemplate(
long chart_id, // идентификатор графика
const string filename // имя файла с шаблоном
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

filename

[in] Имя файла, содержащего шаблон.

Возвращаемое значение

Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Если посредством этой функции из эксперта будет загружен новый шаблон на график, к которому он присоединен, то эксперт будет выгружен и не сможет продолжить работу.

Права на торговлю и использование DLL

Для MQL4 программы, запускаемой на графике, пользователь может при запуске разрешить или запретить:

  1. Совершение торговых операций,
  2. Вызовы функций из DLL.

Терминал позволяет сохранять настроенный график в виде шаблона со всеми запущенными на нем индикаторами и советниками, это позволяет быстро применять настройки шаблона к любым другим графикам.

При сохранении шаблона запоминаются и права для запущенных на графике программ: право на торговлю и право на использование DLL. В целях безопасности эти права при применении шаблона к графику могут ограничиваться:

Права на торговлю и использование DLL не могут быть повышены при запуске советника путем применения шаблона с помощью функции ChartApplyTemplate().

Если у mql4-программы, которая вызывает функцию ChartApplyTemplate(), отсутствуют права на торговлю, то эксперт, загруженный при помощи шаблона, также не будет иметь прав на торговлю вне зависимости от настроек шаблона.

Если у mql4-программы, которая вызывает функцию ChartApplyTemplate(), есть права на торговлю, а в настройках шаблона права отсутствуют, то советник, загруженный при помощи шаблона, не будет иметь прав на торговлю.

Использование шаблонов

Средствами языка MQL4 можно задавать множество свойств графика, в том числе устанавливать цвета с помощью функции ChartSetInteger():

  • Цвет фона графика;
  • Цвет осей, шкалы и строки OHLC;
  • Цвет сетки;
  • Цвет объемов и уровней открытия ордеров;
  • Цвет бара вверх, тени и окантовки тела бычьей свечи;
  • Цвет бара вниз, тени и окантовки тела медвежьей свечи;
  • Цвет линии графика и японских свечей "Доджи";
  • Цвет тела бычьей свечи;
  • Цвет тела медвежьей свечи;
  • Цвет линии Bid-цены;
  • Цвет линии Ask-цены;
  • Цвет линии цены последней совершенной сделки (Last);
  • Цвет уровней стоп-ордеров (Stop Loss и Take Profit).

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

Функция ChartApplyTemplate() предназначена для использования ранее сохраненного шаблона и может использоваться в любой mql4-программе. Вторым параметром функции ChartApplyTemplate() передается путь к имени файла, в котором находится шаблон. Поиск файла шаблона осуществляется по следующим правилам:

  • если в начале пути стоит разделитель обратная косая черта "\" (пишется "\\"), то шаблон ищется относительно пути каталог_данных_терминала\MQL4,
  • если обратной косой черты нет, то шаблон ищется относительно исполняемого EX4-файла, в котором происходит вызов функции ChartApplyTemplate();
  • если шаблон не найден в первых двух вариантах, то поиск ведется в папке каталог_терминала\Profiles\Templates\.

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

Расположение папок каталог_данных_терминала и каталог_терминала можно узнать с помощью функции TerminalInfoString().

//--- каталог из которой запущен терминал
string terminal_path=TerminalInfoString(TERMINAL_PATH);
Print("Каталог терминала:",terminal_path);
//--- каталог данных терминала, в котором находится папка MQL4 с советниками и индикаторами
string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
Print("Каталог данных терминала:",terminal_data_path);

Примеры записи:

//--- шаблон ищем в папке каталог_данных_терминала\MQL4\
ChartApplyTemplate(0,"\\first_template.tpl"))

//--- шаблон ищем в папке каталог_исполняемого_EX4_файла\, затем в папке каталог_данных терминала\Profiles\Templates\
ChartApplyTemplate(0,"second_template.tpl"))

//--- шаблон ищем в папке каталог_исполняемого_EX4_файла\My_templates\, затем в папке каталог_терминала\Profiles\Templates\My_templates\
ChartApplyTemplate(0,"My_templates\\third_template.tpl"))

Шаблоны не относятся к ресурсам, их нельзя включать в исполняемый файл EX4.

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- пример применения шаблона, расположенного в каталоге \MQL4\Files
if(FileIsExist("my_template.tpl"))
{
Print("Шаблон my_template.tpl найден в каталоге \Files'");
//--- применим найденный шаблон
if(ChartApplyTemplate(0,"\\Files\\my_template.tpl"))
{
Print("Применили успешно шаблон 'my_template.tpl'");
}
else
Print("Не удалось применить шаблон 'my_template.tpl', ошибка ",GetLastError());
}
else
{
Print("Файл 'my_template.tpl' не найден в папке "
+TerminalInfoString(TERMINAL_PATH)+"\\MQL4\\Files");
}
}

Смотри также

Ресурсы


ChartSaveTemplate

Справочник MQL4 / Операции с графиками / ChartSaveTemplate

ChartSaveTemplate

Сохраняет текущие настройки графика в шаблон с указанным именем. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.

bool ChartSaveTemplate(
long chart_id, // идентификатор графика
const string filename // имя файла для сохранения шаблона
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

filename

[in] Имя файла для сохранения шаблона. Расширение ".tpl" будет добавлено к имени файла автоматически, указывать его не требуется. Шаблон сохраняется в папку каталог_данных\templates\ и может быть использован также и для ручного применения в терминале. Если шаблон с данным именем уже существует, то его содержимое будет переписано заново.

Возвращаемое значение

Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

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

Смотри также

ChartApplyTemplate(), Ресурсы


ChartWindowFind

Справочник MQL4 / Операции с графиками / ChartWindowFind

ChartWindowFind

Возвращает номер подокна, в котором находится индикатор. Существует 2 варианта функции.

1. Функция ищет на указанном графике подокно с указанным "коротким именем" индикатора (короткое имя выводится слева вверху подокна) и в случае удачи возвращает номер подокна.

int ChartWindowFind(
long chart_id, // идентификатор графика
string indicator_shortname // короткое имя индикатора, см INDICATOR_SHORTNAME

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

int ChartWindowFind();

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

indicator_shortname

[in] Короткое имя индикатора.

Возвращаемое значение

Номер подокна в случае удачи. Ноль означает главное окно графика. В случае неудачи возвращает -1.

Примечание

Если вызывается второй вариант функции (без параметров) из скрипта или эксперта, то она возвращает -1.

Не следует путать короткое имя индикатора и имя файла, которое указывается при создании индикатора функцией iCustom(). Если короткое наименование индикатора не задается явным образом, то при компиляции в нем указывается имя файла с исходным кодом индикатора.

Необходимо правильно формировать короткое имя индикатора, которое с помощью функции IndicatorSetString() записывается в свойство INDICATOR_SHORTNAME. Мы рекомендуем, чтобы короткое имя содержало значения входных параметров индикатора, так как идентификация удаляемого с графика индикатора в функции ChartIndicatorDelete() производится именно по короткому имени.

Пример:

#property script_show_inputs
//--- input parameters
input string shortName="MACD(12,26,9)";
//+------------------------------------------------------------------+
//| Сообщает номер окна графика с указанным индикатором |
//+------------------------------------------------------------------+
int GetIndicatorSubWindowNumber(long chartID=0,string short_name="")
{
int window=-1;
//---
if((ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE)==PROGRAM_INDICATOR)
{
//--- функция вызвана из индикатора,имя не требуется
window=ChartWindowFind();
}
else
{
//--- функция вызвана из эксперта или скрипта
window=ChartWindowFind(0,short_name);
if(window==-1) Print(__FUNCTION__+"(): Error = ",GetLastError());
}
//---
return(window);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int window=GetIndicatorSubWindowNumber(0,shortName);
if(window!=-1)
Print("Индикатор "+shortName+" находится в окне №"+(string)window);
else
Print("Индикатор "+shortName+" не найден. window = "+(string)window);
}

Смотри также

ObjectCreate(), ObjectFind()


ChartTimePriceToXY

Справочник MQL4 / Операции с графиками / ChartTimePriceToXY

ChartTimePriceToXY

Преобразует координаты графика из представления время/цена в координаты по оси X и Y.

bool ChartTimePriceToXY(
long chart_id, // идентификатор графика
int sub_window, // номер подокна
datetime time, // время на графике
double price, // цена на графике
int& x, // координата X для времени на графике
int& y // координата Y для цены на графике
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

sub_window

[in] Номер подокна графика. 0 означает главное окно графика.

time

[in] Значение времени на графике, для которого будет получено значение в пикселах на оси X.

price

[in] Значение цены на графике, для которого будет получено значение в пикселах на оси Y.

x

[out] Переменная, в которую будет получено преобразование времени в координату X. Начало координат находится в левом верхнем углу главного окна графика.

y

[out] Переменная, в которую будет получено преобразование цены в координату Y. Начало координат находится в левом верхнем углу главного окна графика.

Возвращаемое значение

Возвращает true в случае успешного выполнения, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Смотри также

ChartXYToTimePrice()


ChartXYToTimePrice

Справочник MQL4 / Операции с графиками / ChartXYToTimePrice

ChartXYToTimePrice

Преобразует координаты X и Y графика в значения время и цена.

bool ChartXYToTimePrice(
long chart_id, // идентификатор графика
int x, // координата X на графике
int y, // координата Y на графике
int& sub_window, // номер подокна
datetime& time, // время на графике
double& price // цена на графике
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

x

[in] Координата X. Начало координат находится в левом верхнем углу главного окна графика.

y

[in] Координата Y. Начало координат находится в левом верхнем углу главного окна графика.

sub_window

[out] Переменная, в которую будет записан номер подокна графика. 0 означает главное окно графика.

time

[out] Значение времени на графике, для которого будет получено значение в пикселах на оси X.

price

[out] Значение цены на графике, для которого будет получено значение в пикселах на оси Y.

Возвращаемое значение

Возвращает true в случае успешного выполнения, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- выведем параметры события на график
Comment(__FUNCTION__,": id=",id," lparam=",lparam," dparam=",dparam," sparam=",sparam);
//--- если это события клика мышки на графике
if(id==CHARTEVENT_CLICK)
{
//--- подготовим переменные
int x =(int)lparam;
int y =(int)dparam;
datetime dt =0;
double price =0;
int window=0;
//--- преобразуем координаты X и Y в терминах дата/время
if(ChartXYToTimePrice(0,x,y,window,dt,price))
{
PrintFormat("Window=%d X=%d Y=%d => Time=%s Price=%G",window,x,y,TimeToString(dt),price);
//--- сделаем обратное преобразование: (X,Y) => (Time,Price)
if(ChartTimePriceToXY(0,window,dt,price,x,y))
PrintFormat("Time=%s Price=%G => X=%d Y=%d",TimeToString(dt),price,x,y);
else
Print("ChartTimePriceToXY return error code: ",GetLastError());
//--- удаляем линии
ObjectDelete(0,"V Line");
ObjectDelete(0,"H Line");
//--- создаем горизонтальную и вертикальную линии перекрестия
ObjectCreate(0,"H Line",OBJ_HLINE,window,dt,price);
ObjectCreate(0,"V Line",OBJ_VLINE,window,dt,price);
ChartRedraw(0);
}
else
Print("ChartXYToTimePrice return error code: ",GetLastError());
Print("+--------------------------------------------------------------+");
}

Смотри также

ChartTimePriceToXY()


ChartOpen

Справочник MQL4 / Операции с графиками / ChartOpen

ChartOpen

Открывает новый график с указанным символом и периодом. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.

long ChartOpen(
string symbol, // имя символа
ENUM_TIMEFRAMES period // период
);

Параметры

symbol

[in] Символ графика. NULL oзначает символ текущего графика (к которому прикреплен эксперт).

period

[in] Период графика (таймфрейм). Может принимать одно из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

Возвращаемое значение

При успешном открытии графика функция возвращает идентификатор графика. В противном случае возвращает 0. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Максимально возможное количество одновременно открытых графиков в терминале не может быть больше, чем значение CHARTS_MAX.


ChartFirst

Справочник MQL4 / Операции с графиками / ChartFirst

ChartFirst

Возвращает идентификатор первого графика клиентского терминала.

long ChartFirst();

Возвращаемое значение

Идентификатор графика.


ChartNext

Справочник MQL4 / Операции с графиками / ChartNext

ChartNext

Функция возвращает идентификатор графика, следующего за указанным.

long ChartNext(
long chart_id // идентификатор графика
);

Параметры

chart_id

[in] Идентификатор графика. 0 не означает текущий график. 0 означает "вернуть идентификатор первого графика".

Возвращаемое значение

Идентификатор графика. Если список графиков закончился, функция возвращает -1.

Пример:

//--- переменные для идентификаторов графиков
long currChart,prevChart=ChartFirst();
int i=0,limit=100;
Print("ChartFirst = ",ChartSymbol(prevChart)," ID = ",prevChart);
while(i<limit)// у нас наверняка не больше 100 открытых графиков
{
currChart=ChartNext(prevChart); // на основании предыдущего получим новый график
if(currChart<0) break; // достигли конца списка графиков
Print(i,ChartSymbol(currChart)," ID =",currChart);
prevChart=currChart;// запомним идентификатор текущего графика для ChartNext()
i++;// не забудем увеличить счетчик
}


ChartClose

Справочник MQL4 / Операции с графиками / ChartClose

ChartClose

Закрывает указанный график.

bool ChartClose(
long chart_id=0 // идентификатор графика
);

Параметры

chart_id=0

[in] Идентификатор графика. 0 означает текущий график.

Возвращаемое значение

Возвращает true в случае успеха, иначе false.


ChartSymbol

Справочник MQL4 / Операции с графиками / ChartSymbol

ChartSymbol

Возвращает имя символа указанного графика.

string ChartSymbol(
long chart_id=0 // идентификатор графика
);

Параметры

chart_id=0

[in] Идентификатор графика. 0 означает текущий график.

Возвращаемое значение

Если графика не существует, то возвращается пустая строка.

Смотри также

ChartSetSymbolPeriod()


ChartPeriod

Справочник MQL4 / Операции с графиками / ChartPeriod

ChartPeriod

Возвращает значение периода указанного графика.

ENUM_TIMEFRAMES ChartPeriod(
long chart_id=0 // идентификатор графика
);

Параметры

chart_id=0

[in] Идентификатор графика. 0 означает текущий график.

Возвращаемое значение

Значение типа ENUM_TIMEFRAMES. Если графика не существует, то возвращается 0.


ChartRedraw

Справочник MQL4 / Операции с графиками / ChartRedraw

ChartRedraw

Вызывает принудительную перерисовку указанного графика.

void ChartRedraw(
long chart_id=0 // идентификатор графика
);

Параметры

chart_id=0

[in] Идентификатор графика. 0 означает текущий график.

Примечание

Обычно применяется после изменения свойств объектов.

При вызове функции ChartRedraw() из индикатора график будет перерисован только после окончания расчетов в функции OnCalculate(), так как индикаторы выполняются в общем потоке выполнения терминала.

Смотри также

Графические объекты


ChartSetDouble

Справочник MQL4 / Операции с графиками / ChartSetDouble

ChartSetDouble

Задает значение соответствующего свойства указанного графика. Свойство графика должно быть типа double. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.

bool ChartSetDouble(
long chart_id, // идентификатор графика
int prop_id, // идентификатор свойства
double value // значение
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

prop_id

[in] Идентификатор свойства графика. Значение может быть одним из значений перечисления ENUM_CHART_PROPERTY_DOUBLE (кроме read-only свойств).

value

[in] Значение свойства.

Возвращаемое значение

Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().


ChartSetInteger

Справочник MQL4 / Операции с графиками / ChartSetInteger

ChartSetInteger

Задает значение соответствующего свойства указанного графика. Свойство графика должно быть типов datetime, int, color, bool или char. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.

bool ChartSetInteger(
long chart_id, // идентификатор графика
int property_id, // идентификатор свойства
long value // значение
);

Задает значение соответствующего свойства в указанном подокне указанного графика:

bool ChartSetInteger(
long chart_id, // идентификатор графика
int property_id, // идентификатор свойства
uint sub_window, // номер подокна графика
long value // значение
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

prop_id

[in] Идентификатор свойства графика. Значение может быть одним из значений перечисления ENUM_CHART_PROPERTY_INTEGER (кроме read-only свойств).

sub_window

[in] Номер подокна графика.

value

[in] Значение свойства.

Возвращаемое значение

Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().


ChartSetString

Справочник MQL4 / Операции с графиками / ChartSetString

ChartSetString

Задает значение соответствующего свойства указанного графика. Свойство графика должно быть типа string. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.

bool ChartSetString(
long chart_id, // идентификатор графика
int prop_id, // идентификатор свойства
string str_value // значение
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

prop_id

[in] Идентификатор свойства графика. Значение может быть одним из значений перечисления ENUM_CHART_PROPERTY_STRING (кроме read-only свойств).

str_value

[in] Строка для установки свойства. Длина строки не может превышать 2045 символов (лишние символы будут обрезаны).

Возвращаемое значение

Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Функция ChartSetString может использоваться для вывода комментариев на график вместо функции Comment.

Пример:

void OnTick()
{
//---
double Ask,Bid;
int Spread;
Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
string comment=StringFormat("Выводим цены:\nAsk = %G\nBid = %G\nSpread = %d",
Ask,Bid,Spread);
ChartSetString(0,CHART_COMMENT,comment);
}

Смотри также

Comment(), ChartGetString()


ChartGetDouble

Справочник MQL4 / Операции с графиками / ChartGetDouble

ChartGetDouble

Возвращает значение соответствующего свойства указанного графика. Свойство графика должно быть типа double. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

double ChartGetDouble(
long chart_id, // идентификатор графика
int prop_id, // идентификатор свойства
int sub_window=0 // номер подокна, если требуется
);

2. Возвращает true или false в зависимости от успешности выполнения функции. В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool ChartGetDouble(
long chart_id, // идентификатор графика
int prop_id, // идентификатор свойства
int sub_window, // номер подокна
double& double_var // сюда примем значение свойства
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

prop_id

[in] Идентификатор свойства графика. Значение может быть одним из значений перечисления ENUM_CHART_PROPERTY_DOUBLE.

sub_window

[in] Номер подокна графика. Для первого варианта по умолчанию значение равно 0 (главное окно графика). Большинство свойств не требуют указания номера подокна.

double_var

[out] Переменная типа double, принимающая значение запрашиваемого свойства.

Возвращаемое значение

Значение типа double.

Для второго варианта вызова возвращает true, если данное свойство поддерживается и значение было помещено в переменную double_var, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

void OnStart()
{
double priceMin=ChartGetDouble(0,CHART_PRICE_MIN,0);
double priceMax=ChartGetDouble(0,CHART_PRICE_MAX,0);
Print("CHART_PRICE_MIN = ",priceMin);
Print("CHART_PRICE_MAX = ",priceMax);
}


ChartGetInteger

Справочник MQL4 / Операции с графиками / ChartGetInteger

ChartGetInteger

Возвращает значение соответствующего свойства указанного графика. Свойство графика должно быть типов datetime, int или bool. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

long ChartGetInteger(
long chart_id, // идентификатор графика
int prop_id, // идентификатор свойства
int sub_window=0 // номер подокна, если требуется
);

2. Возвращает true или false в зависимости от успешности выполнения функции. В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool ChartGetInteger(
long chart_id, // идентификатор графика
int prop_id, // идентификатор свойства
int sub_window, // номер подокна
long& long_var // сюда примем значение свойства
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

prop_id

[in] Идентификатор свойства графика. Значение может быть одним из значений перечисления ENUM_CHART_PROPERTY_INTEGER.

sub_window

[in] Номер подокна графика. Для первого варианта по умолчанию значение равно 0 (главное окно графика). Большинство свойств не требуют указания номера подокна.

long_var

[out] Переменная типа long, принимающая значение запрашиваемого свойства.

Возвращаемое значение

Значение типа long.

Для второго варианта вызова возвращает true, если данное свойство поддерживается и значение было помещено в переменную long_var, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

void OnStart()
{
int height=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);
int width=ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);
Print("CHART_HEIGHT_IN_PIXELS = ",height," pixels");
Print("CHART_WIDTH_IN_PIXELS = ",width," pixels");
}


ChartGetString

Справочник MQL4 / Операции с графиками / ChartGetString

ChartGetString

Возвращает значение соответствующего свойства указанного графика. Свойство графика должно быть типа string. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

string ChartGetString(
long chart_id, // идентификатор графика
int prop_id // идентификатор свойства
);

2. Возвращает true или false в зависимости от успешности выполнения функции. В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool ChartGetString(
long chart_id, // идентификатор графика
int prop_id, // идентификатор свойства
string& string_var // сюда примем значение свойства
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

prop_id

[in] Идентификатор свойства графика. Значение может быть одним из значений перечисления ENUM_CHART_PROPERTY_STRING.

string_var

[out] Переменная типа string, принимающая значение запрашиваемого свойства.

Возвращаемое значение

Значение типа string.

Для второго варианта вызова возвращает true, если данное свойство поддерживается и значение было помещено в переменную string_var, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Функция ChartGetString может использоваться для считывания комментариев, выведенных на график функциями Comment() или ChartSetString().

Пример:

void OnStart()
{
ChartSetString(0,CHART_COMMENT,"Test comment.\nSecond line.\nThird!");
ChartRedraw();
Sleep(1000);
string comm=ChartGetString(0,CHART_COMMENT);
Print(comm);
}

Смотри также

Comment(), ChartSetString()


ChartNavigate

Справочник MQL4 / Операции с графиками / ChartNavigate

ChartNavigate

Осуществляет сдвиг указанного графика на указанное количество баров относительно указанной позиции графика. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.

bool ChartNavigate(
long chart_id, // идентификатор графика
int position, // позиция
int shift=0 // значение сдвига
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

position

[in] Позиция графика, относительно которой будет произведено смещение. Значение может быть одним из значений перечисления ENUM_CHART_POSITION.

shift=0

[in] Количество баров, на которое необходимо сместить график. Положительное значение означает смещение вправо (к концу графика), отрицательное значение означает смещение влево (к началу графика). Нулевое смещение имеет смысл, когда производится навигация к началу или концу графика.

Возвращаемое значение

Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- получим handle текущего графика
long handle=ChartID();
string comm="";
if(handle>0) // если получилось, дополнительно настроим
{
//--- отключим автопрокрутку
ChartSetInteger(handle,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
ChartSetInteger(handle,CHART_SHIFT,true);
//--- отобразим в виде свечей
ChartSetInteger(handle,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
ChartSetInteger(handle,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK);

//--- подготовим текст для вывода в Comment()
comm="Прокрутим на 10 баров вправо от начала истории";
//--- выведем комментарий
Comment(comm);
//--- прокрутим на 10 баров вправо от начала истории
ChartNavigate(handle,CHART_BEGIN,10);
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии)
long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
//--- добавим символ переноса строки
comm=comm+"\r\n";
//--- дополним коментарий
comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
//--- выведем комментарий
Comment(comm);
//--- подождем 5 секунд, чтобы успеть увидеть, как двигается график
Sleep(5000);

//--- допишем текст комментария
comm=comm+"\r\n"+"Прокрутим на 10 баров влево от правого края графика";
Comment(comm);
//--- прокрутим на 10 баров влево от правого края графика
ChartNavigate(handle,CHART_END,-10);
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии)
first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
comm=comm+"\r\n";
comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
Comment(comm);
//--- подождем 5 секунд, чтобы успеть увидеть, как двигается график
Sleep(5000);

//--- новый блок прокрутки графика
comm=comm+"\r\n"+"Прокрутим на 300 баров вправо от начала истории";
Comment(comm);
//--- прокрутим на 300 баров вправо от начала истории
ChartNavigate(handle,CHART_BEGIN,300);
first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
comm=comm+"\r\n";
comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
Comment(comm);
//--- подождем 5 секунд, чтобы успеть увидеть, как двигается график
Sleep(5000);

//--- новый блок прокрутки графика
comm=comm+"\r\n"+"Прокрутим на 300 баров влево от правого края графика";
Comment(comm);
//--- прокрутим на 300 баров влево от правого края графика
ChartNavigate(handle,CHART_END,-300);
first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
comm=comm+"\r\n";
comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
Comment(comm);
}
}


ChartID

Справочник MQL4 / Операции с графиками / ChartID

ChartID

Возвращает идентификатор текущего графика.

long ChartID();

Возвращаемое значение

Значение типа long.


ChartIndicatorDelete

Справочник MQL4 / Операции с графиками / ChartIndicatorDelete

ChartIndicatorDelete

Удаляет с указанного окна графика индикатор с указанным именем. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.

bool ChartIndicatorDelete(
long chart_id, // идентификатор графика
int sub_window, // номер подокна
const string indicator_shortname // короткое имя индикатора
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

sub_window

[in] Номер подокна графика. 0 означает главное окно графика.

const indicator_shortname

[in] Короткое имя индикатора, которое задается в свойстве INDICATOR_SHORTNAME функцией IndicatorSetString(). Получить короткое имя индикатора можно функцией ChartIndicatorName().

Возвращаемое значение

Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Если в указанном подокне графика существует несколько индикаторов с одинаковым коротким именем, то будет удален первый по порядку.

Если на значениях удаляемого индикатора построены другие индикаторы на этом же графике, то они также будут удалены.

Если короткое наименование индикатора не задается явным образом, то при компиляции в нем указывается имя файла, содержащего исходный код индикатора.

Необходимо правильно формировать короткое имя индикатора, которое с помощью функции IndicatorSetString() записывается в свойство INDICATOR_SHORTNAME. Мы рекомендуем, чтобы короткое имя содержало значения входных параметров индикатора, так как идентификация удаляемого с графика индикатора в функции ChartIndicatorDelete() производится именно по короткому имени.

Пример удаления индикатора при неудачной инициализации:

//+------------------------------------------------------------------+
//| Demo_ChartIndicatorDelete.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 1
//--- plot Histogram
#property indicator_label1 "Histogram"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- input parameters
input int first_param=1;
input int second_param=2;
input int third_param=3;
input bool wrong_init=true;
//--- indicator buffers
double HistogramBuffer[];
string shortname;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
int res=INIT_SUCCEEDED;
//--- привяжем массив HistogramBuffer к индикаторному буферу
SetIndexBuffer(0,HistogramBuffer,INDICATOR_DATA);
//--- сконструируем короткое имя индикатора на основе входных параметров
shortname=StringFormat("Demo_ChartIndicatorDelete(%d,%d,%d)",
first_param,second_param,third_param);
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- если задано принудительное завершение индикатора, вернем ненулевое значение
if(wrong_init) res=INIT_FAILED;
return(res);
}
//+------------------------------------------------------------------+
//| 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[])
{
//--- начальная позиция для работы в цикле
int start=prev_calculated-1;
if(start<0) start=0;
//--- заполняем индикаторный буфер значениями
for(int i=start;i<rates_total;i++)
{
HistogramBuffer[i]=close[i];
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| Обработчик события Deinit |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
PrintFormat("%s: Код причины деинициализации=%d",__FUNCTION__,reason);
if(reason==REASON_INITFAILED)
{
PrintFormat("Индикатор с коротким именем %s (файл %s) удаляет себя с графика",shortname,__FILE__);
int window=ChartWindowFind();
bool res=ChartIndicatorDelete(0,window,shortname);
//--- проанализируем результат вызова ChartIndicatorDelete()
if(!res)
{
PrintFormat("Не удалось удалить индикатор %s с окна #%d. Код ошибки %d",
shortname,window,GetLastError());
}
}
}

Смотри также

ChartIndicatorName(), ChartIndicatorsTotal(), IndicatorSetString()


ChartIndicatorName

Справочник MQL4 / Операции с графиками / ChartIndicatorName

ChartIndicatorName

Возвращает короткое имя индикатора по номеру в списке индикаторов на указанном окна графика.

string ChartIndicatorName(
long chart_id, // идентификатор графика
int sub_window, // номер подокна
int index // индекс индикатора в списке индикаторов, добавленных к данному подокну графика
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

sub_window

[in] Номер подокна графика. 0 означает главное окно графика.

index

[in] Индекс индикатора с списке индикаторов. Нумерация индикаторов начинается с нуля, то есть самый первый индикатор в списке имеет нулевой индекс. Количество индикаторов в списке можно получить функцией ChartIndicatorsTotal().

Возвращаемое значение

Короткое имя индикатора, которое задается в свойстве INDICATOR_SHORTNAME функцией IndicatorSetString(). Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Если короткое наименование индикатора не задается явным образом, то при компиляции в нем указывается имя файла с исходным кодом индикатора.

Необходимо правильно формировать короткое имя индикатора, которое с помощью функции IndicatorSetString() записывается в свойство INDICATOR_SHORTNAME. Мы рекомендуем, чтобы короткое имя содержало значения входных параметров индикатора, так как идентификация удаляемого с графика индикатора в функции ChartIndicatorDelete() производится именно по короткому имени.

Смотри также

ChartIndicatorDelete(), ChartIndicatorsTotal(), IndicatorSetString()


ChartIndicatorsTotal

Справочник MQL4 / Операции с графиками / ChartIndicatorsTotal

ChartIndicatorsTotal

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

int ChartIndicatorsTotal(
long chart_id, // идентификатор графика
int sub_window // номер подокна
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

sub_window

[in] Номер подокна графика. 0 означает главное окно графика.

Возвращаемое значение

Количество индикаторов на указанном окне графика. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Функция предназначена для организации перебора всех индикаторов, присоединенных к данному графику. Количества всех окон графика можно получить из свойства CHART_WINDOWS_TOTAL функцией ChartGetInteger().

Смотри также

ChartIndicatorDelete(), ChartIndicatorsTotal(), IndicatorSetString()


ChartWindowOnDropped

Справочник MQL4 / Операции с графиками / ChartWindowOnDropped

ChartWindowOnDropped

Возвращает номер подокна графика, на которое брошен мышкой данный эксперт или скрипт. 0 означает главное окно графика.

int ChartWindowOnDropped();

Возвращаемое значение

Значение типа int.

Пример:

int myWindow=ChartWindowOnDropped();
int windowsTotal=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
Print("Скрипт запущен на окне #"+myWindow+
". Всего окон на графике "+ChartSymbol()+":",windowsTotal);

Смотри также

ChartPriceOnDropped(), ChartTimeOnDropped(), ChartXOnDropped(), ChartYOnDropped()


ChartPriceOnDropped

Справочник MQL4 / Операции с графиками / ChartPriceOnDropped

ChartPriceOnDropped

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

double ChartPriceOnDropped();

Возвращаемое значение

Значение типа double.

Пример:

double p=ChartPriceOnDropped();
Print("ChartPriceOnDropped() = ",p);

Смотри также

ChartXOnDropped(), ChartYOnDropped()


ChartTimeOnDropped

Справочник MQL4 / Операции с графиками / ChartTimeOnDropped

ChartTimeOnDropped

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

datetime ChartTimeOnDropped();

Возвращаемое значение

Значение типа datetime.

Пример:

datetime t=ChartTimeOnDropped();
Print("Script wasdropped on the "+t);

Смотри также

ChartXOnDropped(), ChartYOnDropped()


ChartXOnDropped

Справочник MQL4 / Операции с графиками / ChartXOnDropped

ChartXOnDropped

Возвращает координату по оси X, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт.

int ChartXOnDropped();

Возвращаемое значение

Значение координаты X.

Примечание

Ось X направлена слева направо.

Пример:

int X=ChartXOnDropped();
int Y=ChartYOnDropped();
Print("(X,Y) = ("+X+","+Y+")");

Смотри также

ChartWindowOnDropped(), ChartPriceOnDropped(), ChartTimeOnDropped()


ChartYOnDropped

Справочник MQL4 / Операции с графиками / ChartYOnDropped

ChartYOnDropped

Возвращает координату по оси Y, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт.

int ChartYOnDropped();

Возвращаемое значение

Значение координаты Y.

Примечание

Ось Y направлена сверху вниз.

Смотри также

ChartWindowOnDropped(), ChartPriceOnDropped(), ChartTimeOnDropped()


ChartSetSymbolPeriod

Справочник MQL4 / Операции с графиками / ChartSetSymbolPeriod

ChartSetSymbolPeriod

Меняет значения символа и периода указанного графика. Функция работает асинхронно, то есть отдает команду и не ждет окончания ее выполнения. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.

bool ChartSetSymbolPeriod(
long chart_id, // идентификатор графика
string symbol, // имя символа
ENUM_TIMEFRAMES period // период
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

symbol

[in] Символ графика. NULL oзначает символ текущего графика (к которому прикреплен эксперт)

period

[in] Период графика (таймфрейм). Может принимать одно из значений значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

Возвращаемое значение

Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Смена символа/периода влечет за собой переинициализацию эксперта, прикрепленного к соответствующему графику. На оффлайновых графиках переинициализация не происходит, осуществляется только обновление графика (аналогично команде Refresh в терминале).

Смотри также

ChartSymbol(), ChartPeriod()


ChartScreenShot

Справочник MQL4 / Операции с графиками / ChartScreenShot

ChartScreenShot

Сохраняет изображение текущего графика в файле формата GIF, PNG или BMP в зависимости от указанного расширения. Отданная команда поступает в очередь сообщений графика и выполняется только после обработки всех предыдущих команд.

bool ChartScreenShot(
long chart_id, // идентификатор графика
string filename, // имя файла
int width, // ширина
int height, // высота
ENUM_ALIGN_MODE align_mode=ALIGN_RIGHT // тип выравнивания
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

filename

[in] Имя файла скриншота. Не может превышать 63 символов. Скриншот помещается в директорию \Files.

width

[in] Ширина скриншота в пикселях

height

[in] Высота скриншота в пикселях

align_mode=ALIGN_RIGHT

[in] Режим вывода узкого скриншота. Значение перечисления ENUM_ALIGN_MODE. ALIGN_RIGHT означает выравнивание по правой границе (вывод с конца). ALIGN_LEFT задает выравнивание по левой границе.

Возвращаемое значение

Возвращает true в случае удачного помещения команды в очередь графика, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Если необходимо снять скриншот графика с определенной позиции, то необходимо сначала позиционировать график при помощи функции ChartNavigate(). Если горизонтальный размер скриншота меньше, чем окно графика, то выводится либо правая часть окна графика, либо левая часть, в зависимости от значения параметра align_mode.

Пример:

#property description "Советник демонстрирует создание серии скриншотов текущего графика"
#property description "с помощью функции ChartScreenShot(). Имя файла для удобства также"
#property description "выводится на график. Высота и ширина рисунков задается макросами."

#define WIDTH 800 // ширина рисунка для вызова ChartScreenShot()
#define HEIGHT 600 // высота рисунка для вызова ChartScreenShot()

//--- input parameters
input int pictures=5; // количество рисунков в серии
int mode=-1; // -1 означает смещение к правому краю графика, 1 - к левому
int bars_shift=300;// количество баров при прокрутке графика функцией ChartNavigate()
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- отключим автопрокрутку графика
ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
ChartSetInteger(0,CHART_SHIFT,true);
//--- установим отображение графика в виде свечей
ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//---
Print("Подготовка советника к работе завершена");
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---

}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- вывод имени функции, времени вызова и идентификатора события
Print(__FUNCTION__,TimeCurrent()," id=",id," mode=",mode);
//--- обработка события CHARTEVENT_CLICK ("Нажатие кнопки мышки на графике")
if(id==CHARTEVENT_CLICK)
{
//--- начальное смещение от края графика
int pos=0;
//--- режим работы с левым краем графика
if(mode>0)
{
//--- прокрутим график к левому краю
ChartNavigate(0,CHART_BEGIN,pos);
for(int i=0;i<pictures;i++)
{
//--- подготовим подпись на графике и имя для файла
string name="ChartScreenShot"+"CHART_BEGIN"+string(pos)+".gif";
//--- вывод имени на график в виде комментария
Comment(name);
//--- сохраним скриншот графика в папку каталог_терминала\MQL4\Files\
if(ChartScreenShot(0,name,WIDTH,HEIGHT,ALIGN_LEFT))
Print("Сохранили скриншот ",name);
//---
pos+=bars_shift;
//--- дадим пользователю время чтобы посмотреть на новый участок графика
Sleep(3000);
//--- прокрутим график от текущей позиции на bars_shift вправо
ChartNavigate(0,CHART_CURRENT_POS,bars_shift);
}
//--- смена режима на противоположный
mode*=-1;
}
else // режим работы с правым краем графика
{
//--- прокрутим график к правому краю
ChartNavigate(0,CHART_END,pos);
for(int i=0;i<pictures;i++)
{
//--- подготовим подпись на графике и имя для файла
string name="ChartScreenShot"+"CHART_END"+string(pos)+".gif";
//--- вывод имени на график в виде комментария
Comment(name);
//--- сохраним скриншот графика в папку каталог_терминала\MQL4\Files\
if(ChartScreenShot(0,name,WIDTH,HEIGHT,ALIGN_RIGHT))
Print("Сохранили скриншот ",name);
//---
pos+=bars_shift;
//--- дадим пользователю время чтобы посмотреть на новый участок графика
Sleep(3000);
//--- прокрутим график от текущей позиции на bars_shift вправо
ChartNavigate(0,CHART_CURRENT_POS,-bars_shift);
}
//--- смена режима на противоположный
mode*=-1;
}
} // конец обработки события CHARTEVENT_CLICK
//--- конец обработчика OnChartEvent()
}

Смотри также

ChartNavigate(), Ресурсы


Period

Справочник MQL4 / Операции с графиками / Period

Period

Возвращает период текущего графика.

int Period();

Параметры

Нет.

Возвращаемое значение

Период текущего графика (в минутах).

Пример:

Print("Период ", Period());


Symbol

Справочник MQL4 / Операции с графиками / Symbol

Symbol

Возвращает текстовую строку с именем текущего финансового инструмента.

string Symbol();

Параметры

Нет.

Возвращаемое значение

Текстовая строка с именем текущего финансового инструмента.

Пример:

int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
// результат выбора проверки, так как ордер может быть закрыт или удален в это время!
if(OrderSelect(pos, SELECT_BY_POS)==false) continue;
if(OrderType()>OP_SELL || OrderSymbol()!=Symbol()) continue;
// делает некоторую обработку...
}


WindowBarsPerChart

Справочник MQL4 / Операции с графиками / WindowBarsPerChart

WindowBarsPerChart

Возвращает количество баров, помещающихся в окно текущего графика.

int WindowBarsPerChart();

Параметры

Нет.

Возвращаемое значение

Количество баров, помещающихся в окно текущего графика.

Пример:

// обработка видимых баров.
int bars_count=WindowBarsPerChart();
int bar=WindowFirstVisibleBar();
for(int i=0; i<bars_count; i++,bar--)
{
// номера баров уменьшаются, так как нумерация идет в обратном порядке.
// ...
}


WindowExpertName

Справочник MQL4 / Операции с графиками / WindowExpertName

WindowExpertName

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

string WindowExpertName();

Параметры

Нет.

Возвращаемое значение

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

Пример:

string name=WindowExpertName();
GlobalVariablesDeleteAll(name);


WindowFind

Справочник MQL4 / Операции с графиками / WindowFind

WindowFind

Возвращает номер подокна графика, содержащего индикатор с указанным именем.

int WindowFind(
string name // имя
);

Параметры

name

[in] Короткое имя индикатора.

Возвращаемое значение

Номер подокна графика, содержащего индикатор с указанным именем name, если он найден, иначе возвращается -1.

Примечание

WindowFind() возвращает -1, если пользовательский индикатор ищет сам себя в процессе инициализации init().

Пример:

int win_idx=WindowFind("MACD(12,26,9)");


WindowFirstVisibleBar

Справочник MQL4 / Операции с графиками / WindowFirstVisibleBar

WindowFirstVisibleBar

Возвращает номер первого видимого бара в окне текущего графика.

int WindowFirstVisibleBar();

Параметры

Нет.

Возвращаемое значение

Номер первого видимого бара в окне текущего графика.

Примечание

Необходимо иметь в виду, что ценовые бары нумеруются задом наперед, от последнего к первому. Текущий бар, самый последний в ценовом массиве, имеет индекс 0. Самый старый бар имеет индекс Bars-1. Если номер первого видимого бара меньше, чем количество видимых баров на графике на 2 и более, это значит, что окно графика заполнено не до конца и имеется поле справа.

Пример:

// обработка видимых баров.
int bars_count=WindowBarsPerChart();
int bar=WindowFirstVisibleBar();
for(int i=0; i<bars_count; i++,bar--)
{
// номера баров уменьшаются, так как нумерация идет в обратном порядке.
// ...
}


WindowHandle

Справочник MQL4 / Операции с графиками / WindowHandle

WindowHandle

Возвращает системный дескриптор окна, содержащего указанный график.

int WindowHandle(
string symbol, // символ
int timeframe // период
);

Параметры

symbol

[in] Символ.

timeframe

[in] Период. Может быть одним из периодов графика. 0 означает период текущего графика.

Возвращаемое значение

Системный дескриптор окна (window handle), содержащего указанный график. Если график с symbol и timeframe на момент вызова функции не открыт, то возвращается 0.

Пример:

int win_handle=WindowHandle("USDX",PERIOD_H1);
if(win_handle!=0)
Print("Окно с USDX,H1 обнаружено. Массив будет скопирован.");


WindowIsVisible

Справочник MQL4 / Операции с графиками / WindowIsVisible

WindowIsVisible

Возвращает состояние видимости подокна графика.

int WindowIsVisible(
int index // индекс подокна графика
);

Параметры

index

[in] Индекс подокна графика.

Возвращаемое значение

Состояние видимости подокна графика (true, если подокно графика видимо, иначе false). Подокно графика может быть скрыто из-за свойств видимости помещенного в него индикатора.

Пример:

int maywin=WindowFind("MyMACD");
if(maywin>-1 && WindowIsVisible(maywin)==true)
Print("окно MyMACD видимое");
else
Print("окно MyMACD не обнаружено или невидимое");


WindowOnDropped

Справочник MQL4 / Операции с графиками / WindowOnDropped

WindowOnDropped

Возвращает индекс окна, в которое был брошен эксперт, пользовательский индикатор или скрипт.

int WindowOnDropped();

Параметры

Нет.

Возвращаемое значение

Индекс окна, в которое был брошен эксперт, пользовательский индикатор или скрипт. Это значение будет верным только в том случае, если эксперты, пользовательские индикаторы и скрипты прикреплены с помощью мыши (технология "drag and drop"). Для пользовательских индикаторов, находящихся в процессе инициализации (вызов из функции init()) этот индекс не определен.

Возвращаемый индекс является номером окна (0-главное окно графика, подокна индикаторов нумеруются с 1), в котором работает пользовательский индикатор. В процессе инициализации пользовательский индикатор может создать свое собственное новое подокно и его номер будет отличаться от номера окна, на которое действительно был брошен индикатор.

Пример:

if(WindowOnDropped()!=0)
{
Print("Скрипт MyVisualTrading должен быть брошен на основное окно графика!");
return(0);
}

Смотри также

WindowXOnDropped(), WindowYOnDropped()


WindowPriceMax

Справочник MQL4 / Операции с графиками / WindowPriceMax

WindowPriceMax

Возвращает максимальное значение вертикальной шкалы указанного подокна текущего графика.

int WindowPriceMax(
int index=0 // индекс подокна
);

Параметры

index=0

[in] Индекс подокна текущего графика (0 - основной график цены).

Возвращаемое значение

Максимальное значение вертикальной шкалы указанного подокна текущего графика (0-главное окно графика, подокна индикаторов нумеруются с 1).

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

Пример:

double top=WindowPriceMax();
double bottom=WindowPriceMin();
datetime left=Time[WindowFirstVisibleBar()];
int right_bound=WindowFirstVisibleBar()-WindowBarsPerChart();
if(right_bound<0) right_bound=0;
datetime right=Time[right_bound]+Period()*60;
//----
ObjectCreate("Padding_rect",OBJ_RECTANGLE,0,left,top,right,bottom);
ObjectSet("Padding_rect",OBJPROP_BACK,true);
ObjectSet("Padding_rect",OBJPROP_COLOR,Blue);
WindowRedraw();

Смотри также

WindowPriceMin(), WindowFirstVisibleBar(), WindowBarsPerChart()


WindowPriceMin

Справочник MQL4 / Операции с графиками / WindowPriceMin

WindowPriceMin

Возвращает минимальное значение вертикальной шкалы указанного подокна текущего графика.

int WindowPriceMin(
int index=0 // индекс подокна
);

Параметры

index=0

[in] Индекс подокна текущего графика (0 - основной график цены).

Возвращаемое значение

Минимальное значение вертикальной шкалы указанного подокна текущего графика (0-главное окно графика, подокна индикаторов нумеруются с 1).

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

Пример:

double top=WindowPriceMax();
double bottom=WindowPriceMin();
datetime left=Time[WindowFirstVisibleBar()];
int right_bound=WindowFirstVisibleBar()-WindowBarsPerChart();
if(right_bound<0) right_bound=0;
datetime right=Time[right_bound]+Period()*60;
//----
ObjectCreate("Padding_rect",OBJ_RECTANGLE,0,left,top,right,bottom);
ObjectSet("Padding_rect",OBJPROP_BACK,true);
ObjectSet("Padding_rect",OBJPROP_COLOR,Blue);
WindowRedraw();

Смотри также

WindowPriceMax(), WindowFirstVisibleBar(), WindowBarsPerChart()


WindowPriceOnDropped

Справочник MQL4 / Операции с графиками / WindowPriceOnDropped

WindowPriceOnDropped

Возвращает значение цены в точке графика, на который был брошен эксперт или скрипт.

double WindowPriceOnDropped();

Параметры

Нет.

Возвращаемое значение

Значение цены в точке графика, на который был брошен эксперт или скрипт. Значение будет верным только в случае, если эксперт или скрипт перемещены с помощью мыши (технология "drag and drop").

Для пользовательских индикаторов это значение не определено.

Пример:

double drop_price=WindowPriceOnDropped();
datetime drop_time=WindowTimeOnDropped();
//---- может быть неопределенным (нуль)
if(drop_time>0)
{
ObjectCreate("Уровень цены", OBJ_HLINE, 0, drop_price);
ObjectCreate("Значение времени", OBJ_VLINE, 0, drop_time);
}

Смотри также

WindowTimeOnDropped(), WindowYOnDropped(), WindowOnDropped()


WindowRedraw

Справочник MQL4 / Операции с графиками / WindowRedraw

WindowRedraw

Принудительно перерисовывает текущий график.

void WindowRedraw();

Параметры

Нет.

Возвращаемое значение

Нет.

Примечание

Принудительная перерисовка текущего графика обычно применяется после изменения свойств объектов.

Пример:

//---- установим новые свойства нескольких объектов
ObjectMove(object_name1, 0, Time[index], price);
ObjectSet(object_name1, OBJPROP_ANGLE, angle*2);
ObjectSet(object_name1, OBJPROP_FONTSIZE, fontsize);
ObjectSet(line_name, OBJPROP_TIME2, time2);
ObjectSet(line_name, OBJPROP_ANGLE, line_angle);
//---- теперь все перерисуем
WindowRedraw();


WindowScreenShot

Справочник MQL4 / Операции с графиками / WindowScreenShot

WindowScreenShot

Сохраняет изображение текущего графика в файле формата GIF.

bool WindowScreenShot(
string filename, // имя файла
int size_x, // ширина
int size_y, // высота
int start_bar=-1, // первый видимый бар
int chart_scale=-1, // масштаб графика
int chart_mode=-1 // вид отображения
);

Параметры

filename

[in] Имя файла скриншота. Не может превышать 63 символов. Скриншот помещается в директорию \Files.

size_x

[in] Ширина скриншота в пикселях.

size_y

[in] Высота скриншота в пикселях.

start_bar=-1

[in] Номер первого видимого бара на скриншоте. Если указано значение 0, то скриншот снимается с текущего первого видимого бара. Если значение не указано, или указано отрицательное значение, то делается скриншот конца графика с учётом правого отступа.

chart_scale=-1

[in] Масштаб графика, выводимого на скриншот. Может принимать значение от 0 до 5. Если значение не указано, или указано отрицательное значение, то используется текущий масштаб графика.

chart_mode=-1

[in] Вид отображения графика. Может принимать значения: CHART_BAR (0 - последовательность баров), CHART_CANDLE (1 - японские свечи), CHART_LINE (2 - линия по ценам закрытия). Если значение не указано, или указано отрицательное значение, то график выводится в своем текущем виде.

Возвращаемое значение

Возвращает true в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Скриншот сохраняется в папке каталог_терминала\experts\files (каталог_терминала\tester\files в случае тестирования эксперта) или ее подпапках.

Пример:

int lasterror=0;
//---- тестер закрыл однин или несколько ордеров
if(IsTesting() && ExtTradesCounter<TradesTotal())
{
//---- снимем скриншот для проверки
if(!WindowScreenShot("shots\\tester"+ExtShotsCounter+".gif",640,480))
lasterror=GetLastError();
else ExtShotsCounter++;
ExtTradesCounter=TradesTotal();
}


WindowTimeOnDropped

Справочник MQL4 / Операции с графиками / WindowTimeOnDropped

WindowTimeOnDropped

Возвращает значение времени в точке графика, на который был брошен эксперт или скрипт.

datetime WindowTimeOnDropped();

Параметры

Нет.

Возвращаемое значение

Значение времени в точке графика, на который был брошен эксперт или скрипт. Значение будет верным только в случае, если эксперт или скрипт перемещены с помощью мыши (технология "drag and drop").

Для пользовательских индикаторов это значение не определено.

Пример:

double drop_price=WindowPriceOnDropped();
datetime drop_time=WindowTimeOnDropped();
//---- может быть неопределенным (нуль)
if(drop_time>0)
{
ObjectCreate("Уровень цены", OBJ_HLINE, 0, drop_price);
ObjectCreate("Значение времени", OBJ_VLINE, 0, drop_time);
}

Смотри также

WindowPriceOnDropped(), WindowYOnDropped(), WindowOnDropped()


WindowsTotal

Справочник MQL4 / Операции с графиками / WindowsTotal

WindowsTotal

Возвращает количество окон индикаторов на графике, включая главное окно графика.

int WindowsTotal();

Параметры

Нет.

Возвращаемое значение

Количество окон индикаторов на графике, включая главное окно графика.

Пример:

Print("Количество окон = ", WindowsTotal());


WindowXOnDropped

Справочник MQL4 / Операции с графиками / WindowXOnDropped

WindowXOnDropped

Возвращает значение координаты по оси X в пикселах точки клиентской области окна графика, на которой был брошен эксперт или скрипт.

int WindowXOnDropped();

Параметры

Нет.

Возвращаемое значение

Значение координаты по оси X в пикселах точки клиентской области окна графика, на которой был брошен эксперт или скрипт. Значение будет верным только в случае, если эксперт или скрипт перемещены с помощью мыши (технология "drag and drop").

Пример:

Print("Эксперт был прикреплен к окну в точке с координатами x=",WindowXOnDropped()," y=",WindowYOnDropped());

Смотри также

WindowYOnDropped(), WindowTimeOnDropped(), WindowOnDropped()


WindowYOnDropped

Справочник MQL4 / Операции с графиками / WindowYOnDropped

WindowYOnDropped

Возвращает значение координаты по оси Y в пикселах точки клиентской области окна графика, на которой был брошен эксперт или скрипт.

int WindowYOnDropped();

Параметры

Нет.

Возвращаемое значение

Значение координаты по оси Y в пикселах точки клиентской области окна графика, на которой был брошен эксперт или скрипт. Значение будет верным только в случае, если эксперт или скрипт перемещены с помощью мыши (технология "drag and drop").

Пример:

Print("Эксперт был прикреплен к окну в точке с координатами x=",WindowXOnDropped()," y=",WindowYOnDropped());

Смотри также

WindowYOnDropped(), WindowPriceOnDropped(), WindowOnDropped()


Торговые функции

Справочник MQL4 / Торговые функции

Торговые функции

Группа функций, предназначенных для управления торговой деятельностью.

Торговые функции могут использоваться в экспертах и скриптах. Торговые функции OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete(), изменяющие состояние торгового счета, могут быть вызваны только в том случае, если в свойствах соответствующего эксперта или скрипта включена галочка "Разрешить советнику торговать".

Разрешение или запрет на торговлю может зависеть от множества факторов, которые описаны в разделе "Разрешение на торговлю".

Функция | Действие
OrderClose | Осуществляет закрытие ордера
OrderCloseBy | Осуществляет закрытие одного открытого ордера другим ордером, открытым по тому же самому инструменту, но в противоположном направлении
OrderClosePrice | Возвращает цену закрытия выбранного ордера
OrderCloseTime | Возвращает время закрытия выбранного ордера
OrderComment | Возвращает комментарий выбранного ордера
OrderCommission | Возвращает значение рассчитанной комиссии выбранного ордера
OrderDelete | Осуществляет удаление ранее установленного отложенного ордера
OrderExpiration | Возвращает дату истечения выбранного отложенного ордера
OrderLots | Возвращает количество лотов выбранного ордера
OrderMagicNumber | Возвращает идентификационное ("магическое") число выбранного ордера
OrderModify | Изменяет параметры ранее открытых или отложенных ордеров
OrderOpenPrice | Возвращает цену открытия выбранного ордера
OrderOpenTime | Возвращает время открытия выбранного ордера
OrderPrint | Выводит в журнал информацию о свойствах выбранного ордера
OrderProfit | Возвращает значение чистой прибыли выбранного ордера
OrderSelect | Выбирает ордер для дальнейшей работы с ним
OrderSend | Основная функция, используемая для совершения торговых операций или установки отложенного ордера
OrdersHistoryTotal | Возвращает количество закрытых и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале
OrderStopLoss | Возвращает значение цены закрытия ордера при достижении убыточности (stop loss) текущего выбранного ордера.
OrdersTotal | Возвращает общее количество открытых и отложенных ордеров
OrderSwap | Возвращает значение свопа текущего выбранного ордера
OrderSymbol | Возвращает наименование финансового инструмента текущего выбранного ордера
OrderTakeProfit | Возвращает значение цены закрытия ордера при достижении уровня прибыльности (take profit) текущего выбранного ордера
OrderTicket | Возвращает номер тикета текущего выбранного ордера
OrderType | Возвращает тип операции текущего выбранного ордера

Что нового в MQL5

Для проведения торговых операций в языке MQL5 представлены функции по работе с ордерами, сделками и позициями. Ордер – это запрос на совершение покупки или продажи, при исполнении которого совершается сделка, результатом сделки является открытие, изменение или закрытие позиции.

Если вы пишете торговых роботов, обратите внимание на новую функцию OrderSendAsync, предназначенную для проведения асинхронных торговых операций. Эта функция выполняется менее чем за 1 миллисекунду (не ждёт ответа торгового сервера на отправленный запрос) и тут же возвращает управление. Низкие сетевые издержки, высокая скорость обновления стакана и асинхронная отсылка приказов в десятки раз ускоряют торговые операции. Для интрадей систем скорость торговых операций может являться ключевым фактором.


OrderClose

Справочник MQL4 / Торговые функции / OrderClose

OrderClose

Осуществляет закрытие ордера.

bool OrderClose(
int ticket, // номер ордера
double lots, // количество лотов
double price, // цена закрытия
int slippage, // максимальное проскальзывание
color arrow_color // цвет
);

Параметры

ticket

[in] Уникальный порядковый номер ордера.

lots

[in] Количество лотов для закрытия.

price

[in] Цена закрытия.

slippage

[in] Значение максимального проскальзывания в пунктах.

arrow_color

[in] Цвет стрелки закрытия на графике. Если параметр отсутствует, или его значение равно CLR_NONE, то стрелка на графике не отображается.

Возвращаемое значение

Возвращает true при успешном завершении функции или false в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
OrderClose(order_id,1,Ask,3,Red);
return(0);
}


OrderCloseBy

Справочник MQL4 / Торговые функции / OrderCloseBy

OrderCloseBy

Закрытие одним открытым ордером другого ордера, открытого по тому же самому инструменту, но в противоположном направлении.

bool OrderCloseBy(
int ticket, // номер ордера для закрытия
int opposite, // номер противоположного ордера
color arrow_color // цвет
);

Параметры

ticket

[in] Уникальный порядковый номер закрываемого ордера.

opposite

[in] Уникальный порядковый номер противоположного ордера.

arrow_color

[in] Цвет стрелки закрытия на графике. Если параметр отсутствует, или его значение равно CLR_NONE, то стрелка на графике не отображается.

Возвращаемое значение

Возвращает true при успешном завершении функции или false в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
OrderCloseBy(order_id,opposite_id);
return(0);
}


OrderClosePrice

Справочник MQL4 / Торговые функции / OrderClosePrice

OrderClosePrice

Возвращает цену закрытия выбранного ордера.

double OrderClosePrice();

Возвращаемое значение

Цена закрытия выбранного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true)
{
datetime ctm=OrderOpenTime();
if(ctm>0) Print("Open time for the order 10 ", ctm);
ctm=OrderCloseTime();
if(ctm>0) Print("Close time for the order 10 ", ctm);
}
else
Print("OrderSelect failed error code is",GetLastError());


OrderCloseTime

Справочник MQL4 / Торговые функции / OrderCloseTime

OrderCloseTime

Возвращает время закрытия выбранного ордера.

datetime OrderCloseTime();

Возвращаемое значение

Время закрытия выбранного ордера. Только закрытые ордера имеют время закрытия, не равное 0. Открытые или отложенные ордера имеют время закрытия, равное 0.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true)
{
datetime ctm=OrderOpenTime();
int ticket=OrderTicket();
if(ctm>0) Print("Время открытия ордера ",ticket," ",ctm);
ctm=OrderCloseTime();
if(ctm>0) Print("Время закрытия ордера ",ticket," ",ctm);
}
else
Print("OrderSelect() вернул ошибку ",GetLastError());


OrderComment

Справочник MQL4 / Торговые функции / OrderComment

OrderComment

Возвращает комментарий выбранного ордера.

string OrderComment();

Возвращаемое значение

Комментарий выбранного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

string comment;
if(OrderSelect(10,SELECT_BY_TICKET)==false)
{
Print("OrderSelect() вернул ошибку - ",GetLastError());
return(0);
}
comment = OrderComment();
// ...


OrderCommission

Справочник MQL4 / Торговые функции / OrderCommission

OrderCommission

Возвращает значение рассчитанной комиссии выбранного ордера.

double OrderCommission();

Возвращаемое значение

Значение рассчитанной комиссии выбранного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10,SELECT_BY_POS)==true)
Print("Commission for the order 10 ",OrderCommission());
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderDelete

Справочник MQL4 / Торговые функции / OrderDelete

OrderDelete

Осуществляет удаление ранее установленного отложенного ордера.

bool OrderDelete(
int ticket, // номер ордера
color arrow_color // цвет
);

Параметры

ticket

[in] Уникальный порядковый номер ордера.

arrow_color

[in] Цвет стрелки на графике. Если параметр отсутствует, или его значение равно CLR_NONE, то стрелка на графике не отображается.

Возвращаемое значение

Возвращает true при успешном завершении функции или false в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

if(Ask>var1)
{
OrderDelete(order_ticket);
return(0);
}


OrderExpiration

Справочник MQL4 / Торговые функции / OrderExpiration

OrderExpiration

Возвращает дату истечения выбранного отложенного ордера.

datetime OrderExpiration();

Возвращаемое значение

Дата истечения выбранного отложенного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10, SELECT_BY_TICKET)==true)
Print("Order expiration for the order #10 is ",OrderExpiration());
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderLots

Справочник MQL4 / Торговые функции / OrderLots

OrderLots

Возвращает количество лотов выбранного ордера.

double OrderLots();

Возвращаемое значение

Количество лотов выбранного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10,SELECT_BY_POS)==true)
Print("lots for the order 10 ",OrderLots());
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderMagicNumber

Справочник MQL4 / Торговые функции / OrderMagicNumber

OrderMagicNumber

Возвращает идентификационное ("магическое") число выбранного ордера.

int OrderMagicNumber();

Возвращаемое значение

Идентификационное число выбранного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10,SELECT_BY_POS)==true)
Print("Magic number for the order 10 ", OrderMagicNumber());
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderModify

Справочник MQL4 / Торговые функции / OrderModify

OrderModify

Изменяет параметры ранее открытых или отложенных ордеров.

bool OrderModify(
int ticket, // номер ордера
double price, // цена открытия
double stoploss, // stop loss
double takeprofit, // take profit
datetime expiration, // время истечения ордера
color arrow_color // цвет
);

Параметры

ticket

[in] Уникальный порядковый номер ордера для модификации.

price

[in] Новая цена открытия отложенного ордера.

stoploss

[in] Новое значение StopLoss.

takeprofit

[in] Новое значение TakeProfit.

expiration

[in] Время истечения отложенного ордера.

arrow_color

[in] Цвет стрелок модификации StopLoss и/или TakeProfit на графике. Если параметр отсутствует, или его значение равно CLR_NONE, то стрелка на графике не отображается.

Возвращаемое значение

Возвращает true при успешном завершении функции или false в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Цену открытия и время истечения можно изменять только у отложенных ордеров. Если в качестве параметров функции передать неизмененные значения, то в этом случае будет сгенерирована ошибка 1 (ERR_NO_RESULT).

На некоторых торговых серверах может быть установлен запрет на применение срока истечения отложенных ордеров. В этом случае при попытке задать ненулевое значение в параметре expiration будет сгенерирована ошибка 147 (ERR_TRADE_EXPIRATION_DENIED).

Пример:

void OnStart()
{
int TrailingStop=50;
//--- модифицирует цену Stop Loss ордера на покупку №12345
if(TrailingStop>0)
{
OrderSelect(12345,SELECT_BY_TICKET);
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
if(!res)
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
Print("Цена Stop Loss ордера успешно модифицирована.");
}
}
}
}


OrderOpenPrice

Справочник MQL4 / Торговые функции / OrderOpenPrice

OrderOpenPrice

Возвращает цену открытия выбранного ордера.

double OrderOpenPrice();

Возвращаемое значение

Цена открытия выбранного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10, SELECT_BY_POS)==true)
Print("open price for the order 10 ",OrderOpenPrice());
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderOpenTime

Справочник MQL4 / Торговые функции / OrderOpenTime

OrderOpenTime

Возвращает время открытия выбранного ордера.

datetime OrderOpenTime();

Возвращаемое значение

Время открытия выбранного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10, SELECT_BY_POS)==true)
Print("open time for the order 10 ", OrderOpenTime());
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderPrint

Справочник MQL4 / Торговые функции / OrderPrint

OrderPrint

Выводит в журнал информацию о свойствах выбранного ордера.

void OrderPrint();

Примечание

Данные ордера выводятся в журнал в виде строки следующего формата:

#номер тикета; время открытия; торговая операция; количество лотов; символ; цена открытия; стоп лосс; тейк профит; время закрытия; цена закрытия; комиссия; своп; прибыль; комментарий; магическое число; дата истечения отложенного ордера.

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10, SELECT_BY_TICKET)==true)
OrderPrint();
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderProfit

Справочник MQL4 / Торговые функции / OrderProfit

OrderProfit

Возвращает значение чистой прибыли выбранного ордера.

double OrderProfit();

Возвращаемое значение

Значение чистой прибыли (без учета свопов и комиссий) выбранного ордера. Для открытых ордеров это текущая нереализованная прибыль, для закрытых ордеров - зафиксированная прибыль.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(10, SELECT_BY_POS)==true)
Print("Profit for the order 10 ",OrderProfit());
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderSelect

Справочник MQL4 / Торговые функции / OrderSelect

OrderSelect

Выбирает ордер для дальнейшей работы с ним.

bool OrderSelect(
int index, // индекс или тикет ордера
int select, // флаг способа выбора
int pool=MODE_TRADES // источник данных для выбора
);

Параметры

ticket

[in] Индекс ордера или номер ордера в зависимости от второго параметра.

select

[in] Флаг способа выбора. Mожет быть одним из следующих величин:

SELECT_BY_POS - в параметре index передается порядковый номер ордера в списке,
SELECT_BY_TICKET - в параметре index передается номер тикета.

pool=MODE_TRADES

[in] Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Mожет быть одной из следующих величин:

MODE_TRADES (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY - ордер выбирается среди закрытых и удаленных ордеров.

Возвращаемое значение

Возвращает true при успешном завершении функции или false в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера.

Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых ордеров терминала.

Отличить открытый ордер от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера.

Функция OrderSelect() копирует данные об ордере в программное окружение, и последующие вызовы OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderCommission(), OrderExpiration(), OrderLots(), OrderMagicNumber(), OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType() возвращают ранее скопированные данные. Это означает, что самого ордера может уже и не быть (или же в нем изменились цена открытия, уровни Stop Loss / Take Profit или момент истечения), а данные этому ордеру можно еще получать. Для гарантированного получения свежих данных об ордере рекомендуется вызывать функцию OrderSelect() непосредственно перед обращением за ними.

При последовательном выборе ордеров с помощью параметра SELECT_BY_POS информация отдаётся в том порядке, в котором она поступила с торгового сервера. Никакая сортировка полученного списка ордеров не гарантируется.

Пример:

if(OrderSelect(12470, SELECT_BY_TICKET)==true)
{
Print("order #12470 open price is ", OrderOpenPrice());
Print("order #12470 close price is ", OrderClosePrice());
}
else
Print("OrderSelect() вернул ошибку - ",GetLastError());

Смотри также

Свойства ордеров, OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderCommission(), OrderExpiration(), OrderLots(), OrderMagicNumber(), OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType()


OrderSend

Справочник MQL4 / Торговые функции / OrderSend

OrderSend

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

int OrderSend(
string symbol, // символ
int cmd, // торговая операция
double volume, // количество лотов
double price, // цена
int slippage, // проскальзывание
double stoploss, // stop loss
double takeprofit, // take profit
string comment=NULL, // комментарий
int magic=0, // идентификатор
datetime expiration=0, // срок истечения ордера
color arrow_color=clrNONE // цвет
);

Параметры

symbol

[in] Наименование финансового инструмента, с которым проводится торговая операция.

cmd

[in] Торговая операция. Может быть любым из значений торговых операций.

volume

[in] Количество лотов.

price

[in] Цена открытия.

slippage

[in] Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).

stoploss

[in] Цена закрытия ордера при достижении уровня убыточности (0 в случае отсутствия уровня убыточности).

takeprofit

[in] Цена закрытия ордера при достижении уровня прибыльности (0 в случае отсутствия уровня прибыльности).

comment=NULL

[in] Текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером.

magic=0

[in] Магическое число ордера. Может использоваться как определяемый пользователем идентификатор.

expiration=0

[in] Срок истечения отложенного ордера.

arrow_color=clrNONE

[in] Цвет открывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то открывающая стрелка не отображается на графике.

Возвращаемое значение

Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

При открытии рыночного ордера (OP_SELL или OP_BUY) в качестве цены открытия могут использоваться только самые последние цены Bid (для продажи) или Ask (для покупки). Если операция проводится по финансовому инструменту, отличному от текущего, то для получения последних котировок по этому инструменту необходимо воспользоваться функцией MarketInfo() с параметром MODE_BID или MODE_ASK.

Нельзя использовать расчетную либо ненормализованную цену. Если запрашиваемой цены открытия не было в ценовом потоке, либо запрашиваемая цена не нормализована в соответствии с количеством знаков после десятичной точки, то будет сгенерирована ошибка 129 (ERR_INVALID_PRICE). Если запрашиваемая цена открытия сильно устарела, то независимо от значения параметра slippage будет сгенерирована ошибка 138 (ERR_REQUOTE). Если же запрашиваемая цена устарела, но еще присутствует в ценовом потоке, то ордер открывается по текущей цене и только в том случае, если текущая цена попадает в диапазон price+-slippage.

Цены StopLoss и TakeProfit не могут располагаться слишком близко к рынку. Минимальное расстояние стопов в пунктах можно получить, используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае ошибочных, а также ненормализованных стопов генерируется ошибка 130 (ERR_INVALID_STOPS). Нулевое значение MODE_STOPLEVEL означает либо отсутствие ограничения на минимальную дистанцию для стоп-лосса/тейк-профита, либо факт использования торговым сервером внешних механизмов динамического контроля уровней, которые не могут быть транслированы в терминал. Во втором случае GetLastError() может возвращать ошибку 130, так как уровень MODE_STOPLEVEL фактически является "плавающим".

При установке отложенного ордера цена открытия не может быть слишком близкой к рынку. Минимальное расстояние отложенной цены от текущей рыночной цены в пунктах также можно получить, используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае неправильной цены открытия отложенного ордера будет сгенерирована ошибка 130 (ERR_INVALID_STOPS).

На некоторых торговых серверах может быть установлен запрет на применение срока истечения отложенных ордеров. В этом случае при попытке задать ненулевое значение в параметре expiration будет сгенерирована ошибка 147 (ERR_TRADE_EXPIRATION_DENIED).

На некоторых торговых серверах может быть установлен лимит на общее количество открытых и отложенных ордеров. При превышении этого лимита новый ордер открыт не будет (отложенный ордер не будет установлен), и торговый сервер вернет ошибку 148 (ERR_TRADE_TOO_MANY_ORDERS).

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- получим минимальное значение Stop level
double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
Print("Minimum Stop Level=",minstoplevel," points");
double price=Ask;
//--- вычисленные значения цен SL и TP должны быть нормализованы
double stoploss=NormalizeDouble(Bid-minstoplevel*Point,Digits);
double takeprofit=NormalizeDouble(Bid+minstoplevel*Point,Digits);
//--- размещаем рыночный ордер на покупку 1 лота
int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen);
if(ticket<0)
{
Print("OrderSend завершилась с ошибкой #",GetLastError());
}
else
Print("Функция OrderSend успешно выполнена");
//---
}


OrdersHistoryTotal

Справочник MQL4 / Торговые функции / OrdersHistoryTotal

OrdersHistoryTotal

Возвращает количество закрытых и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале.

int OrdersHistoryTotal();

Возвращаемое значение

Количество закрытых и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале. Размер списка истории зависит от текущих настроек вкладки "История счета" терминала.

Пример:

// retrieving info from trade history
int i,accTotal=OrdersHistoryTotal();
for(i=0;i<accTotal;i++)
{
//---- check selection result
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
break;
}
// работа с ордером ...
}


OrderStopLoss

Справочник MQL4 / Торговые функции / OrderStopLoss

OrderStopLoss

Возвращает значение цены закрытия ордера при достижении убыточности (stop loss) текущего выбранного ордера.

double OrderStopLoss();

Возвращаемое значение

Значение цены закрытия ордера при достижении уровня убыточности (stop loss) текущего выбранного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(ticket,SELECT_BY_POS)==true)
Print("Stop loss value for the order 10 ", OrderStopLoss());
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrdersTotal

Справочник MQL4 / Торговые функции / OrdersTotal

OrdersTotal

Возвращает общее количество открытых и отложенных ордеров.

int OrdersTotal();

Возвращаемое значение

Общее количество открытых и отложенных ордеров.

Пример:

int handle=FileOpen("OrdersReport.csv",FILE_WRITE|FILE_CSV,"\t");
if(handle<0) return(0);
// запишем заголовок в файл
FileWrite(handle,"#","Цена открытия","Время открытия","Символ","Лоты");
int total=OrdersTotal();
// записываем в файл только открытые ордера
for(int pos=0;pos<total;pos++)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==false) continue;
FileWrite(handle,OrderTicket(),OrderOpenPrice(),OrderOpenTime(),OrderSymbol(),OrderLots());
}
FileClose(handle);


OrderSwap

Справочник MQL4 / Торговые функции / OrderSwap

OrderSwap

Возвращает значение свопа текущего выбранного ордера.

double OrderSwap();

Возвращаемое значение

Значение свопа текущего выбранного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(order_id, SELECT_BY_TICKET)==true)
Print("Swap for the order #", order_id, " ",OrderSwap());
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderSymbol

Справочник MQL4 / Торговые функции / OrderSymbol

OrderSymbol

Возвращает наименование финансового инструмента текущего выбранного ордера.

string OrderSymbol();

Возвращаемое значение

Наименование финансового инструмента текущего выбранного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(12, SELECT_BY_POS)==true)
Print("symbol of order #", OrderTicket(), " is ", OrderSymbol());
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderTakeProfit

Справочник MQL4 / Торговые функции / OrderTakeProfit

OrderTakeProfit

Возвращает значение цены закрытия ордера при достижении уровня прибыльности (take profit) текущего выбранного ордера.

double OrderTakeProfit();

Возвращаемое значение

Значение цены закрытия ордера при достижении уровня прибыльности (take profit) текущего выбранного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(12, SELECT_BY_POS)==true)
Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderTicket

Справочник MQL4 / Торговые функции / OrderTicket

OrderTicket

Возвращает номер тикета текущего выбранного ордера.

int OrderTicket();

Возвращаемое значение

Номер тикета текущего выбранного ордера.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

if(OrderSelect(12, SELECT_BY_POS)==true)
Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderType

Справочник MQL4 / Торговые функции / OrderType

OrderType

Возвращает тип операции текущего выбранного ордера.

int OrderType();

Возвращаемое значение

Тип операции текущего выбранного ордера. Mожет быть одной из следующих величин:

  • OP_BUY - ордер на покупку,
  • OP_SELL - ордер на продажу,
  • OP_BUYLIMIT - отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня,
  • OP_BUYSTOP - отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня,
  • OP_SELLLIMIT - отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня,
  • OP_SELLSTOP - отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

int order_type;
if(OrderSelect(12, SELECT_BY_POS)==true)
{
order_type=OrderType();
// ...
}
else
Print("OrderSelect() вернул ошибку - ",GetLastError());


Управление сигналами

Справочник MQL4 / Управление сигналами

Управление сигналами

Группа функций, предназначенных для управления торговыми сигналами. Данные функции позволяют:

  • получать информацию о торговых сигналах, доступных для копирования,
  • прочитать или установить настройки копирования торговых сигналов,
  • произвести подписку на сигнал и ее отмену средствами языка MQL4.
Функция | Действие
SignalBaseGetDouble | Возвращает значение свойства типа double для выбранного сигнала
SignalBaseGetInteger | Возвращает значение свойства типа integer для выбранного сигнала
SignalBaseGetString | Возвращает значение свойства типа string для выбранного сигнала
SignalBaseSelect | Выбирает для работы сигнал из базы торговых сигналов, доступных в терминале
SignalBaseTotal | Возвращает общее количество сигналов, доступных в терминале
SignalInfoGetDouble | Возвращает из настроек копирования торгового сигнала значение свойства типа double
SignalInfoGetInteger | Возвращает из настроек копирования торгового сигнала значение свойства типа integer
SignalInfoGetString | Возвращает из настроек копирования торгового сигнала значение свойства типа string
SignalInfoSetDouble | Устанавливает в настройках копирования торгового сигнала значение свойства типа double
SignalInfoSetInteger | Устанавливает в настройках копирования торгового сигнала значение свойства типа integer
SignalSubscribe | Производит подписку на копирование торгового сигнала
SignalUnsubscribe | Отменяет подписку на копирование торгового сигнала


SignalBaseGetDouble

Справочник MQL4 / Управление сигналами / SignalBaseGetDouble

SignalBaseGetDouble

Возвращает значение свойства типа double для выбранного сигнала.

double SignalBaseGetDouble(
ENUM_SIGNAL_BASE_DOUBLE property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства сигнала. Может быть одним из значений перечисления ENUM_SIGNAL_BASE_DOUBLE.

Возвращаемое значение

Значение типа double указанного свойства сигнала.


SignalBaseGetInteger

Справочник MQL4 / Управление сигналами / SignalBaseGetInteger

SignalBaseGetInteger

Возвращает значение свойства типа integer для выбранного сигнала.

long SignalBaseGetInteger(
ENUM_SIGNAL_BASE_INTEGER property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства сигнала. Может быть одним из значений перечисления ENUM_SIGNAL_BASE_INTEGER.

Возвращаемое значение

Значение типа integer указанного свойства сигнала.


SignalBaseGetString

Справочник MQL4 / Управление сигналами / SignalBaseGetString

SignalBaseGetString

Возвращает значение свойства типа string для выбранного сигнала.

string SignalBaseGetString(
ENUM_SIGNAL_BASE_STRING property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства сигнала. Может быть одним из значений перечисления ENUM_SIGNAL_BASE_STRING.

Возвращаемое значение

Значение типа string указанного свойства сигнала.


SignalBaseSelect

Справочник MQL4 / Управление сигналами / SignalBaseSelect

SignalBaseSelect

Выбирает для работы сигнал из базы торговых сигналов, доступных в терминале.

bool SignalBaseSelect(
int index // индекс записи сигнала
);

Параметры

index

[in] Индекс записи сигнала в базе торговых сигналов.

Возвращаемое значение

Возвращает true при успешном завершении функции или false в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

void OnStart()
{
//--- запрашиваем общее количество сигналов в базе
int total=SignalBaseTotal();
//--- цикл по всем сигналам
for(int i=0;i<total;i++)
{
//--- выбираем сигнал для дальнейшей работы
if(SignalBaseSelect(i))
{
//--- получение свойств сигнала
long id =SignalBaseGetInteger(SIGNAL_BASE_ID); // id сигнала
long pips =SignalBaseGetInteger(SIGNAL_BASE_PIPS); // результат торговли в пипсах
long subscr=SignalBaseGetInteger(SIGNAL_BASE_SUBSCRIBERS); // количество подписчиков
string name =SignalBaseGetString(SIGNAL_BASE_NAME); // имя сигнала
double price =SignalBaseGetDouble(SIGNAL_BASE_PRICE); // цена подписки на сигнал
string curr =SignalBaseGetString(SIGNAL_BASE_CURRENCY); // валюта сигнала
//--- выводим все прибыльные бесплатные сигналы с ненулевым количеством подписчиков
if(price==0.0 && pips>0 && subscr>0)
PrintFormat("id=%d, name=\"%s\", currency=%s, pips=%d, subscribers=%d",id,name,curr,pips,subscr);
}
else PrintFormat("Ошибка выбора сигнала. Код ошибки=%d",GetLastError());
}
}


SignalBaseTotal

Справочник MQL4 / Управление сигналами / SignalBaseTotal

SignalBaseTotal

Возвращает общее количество сигналов, доступных в терминале.

int SignalBaseTotal();

Возвращаемое значение

Общее количество сигналов, доступных в терминале.


SignalInfoGetDouble

Справочник MQL4 / Управление сигналами / SignalInfoGetDouble

SignalInfoGetDouble

Возвращает из настроек копирования торгового сигнала значение свойства типа double.

double SignalInfoGetDouble(
ENUM_SIGNAL_INFO_DOUBLE property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства настроек копирования торгового сигнала. Может быть одним из значений перечисления ENUM_SIGNAL_INFO_DOUBLE.

Возвращаемое значение

Значение типа double указанного свойства настроек копирования торгового сигнала.


SignalInfoGetInteger

Справочник MQL4 / Управление сигналами / SignalInfoGetInteger

SignalInfoGetInteger

Возвращает из настроек копирования торгового сигнала значение свойства типа integer.

long SignalInfoGetInteger(
ENUM_SIGNAL_INFO_INTEGER property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства настроек копирования торгового сигнала. Может быть одним из значений перечисления ENUM_SIGNAL_INFO_INTEGER.

Возвращаемое значение

Значение типа integer указанного свойства настроек копирования торгового сигнала.


SignalInfoGetString

Справочник MQL4 / Управление сигналами / SignalInfoGetString

SignalInfoGetString

Возвращает из настроек копирования торгового сигнала значение свойства типа string.

string SignalInfoGetString(
ENUM_SIGNAL_INFO_STRING property_id // идентификатор свойства
);

Параметры

property_id

[in] Идентификатор свойства настроек копирования торгового сигнала. Значение может быть одним из значений перечисления ENUM_SIGNAL_INFO_STRING.

Возвращаемое значение

Значение типа string указанного свойства настроек копирования торгового сигнала.


SignalInfoSetDouble

Справочник MQL4 / Управление сигналами / SignalInfoSetDouble

SignalInfoSetDouble

Устанавливает в настройках копирования торгового сигнала значение свойства типа double.

bool SignalInfoSetDouble(
ENUM_SIGNAL_INFO_DOUBLE property_id, // идентификатор свойства
double value // значение свойства
);

Параметры

property_id

[in] Идентификатор свойства настроек копирования торгового сигнала. Может быть одним из значений перечисления ENUM_SIGNAL_INFO_DOUBLE.

value

[in] Значение свойства настроек копирования торгового сигнала.

Возвращаемое значение

Возвращает true в случае успешного изменения свойства, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().


SignalInfoSetInteger

Справочник MQL4 / Управление сигналами / SignalInfoSetInteger

SignalInfoSetInteger

Устанавливает в настройках копирования торгового сигнала значение свойства типа integer.

bool SignalInfoSetInteger(
ENUM_SIGNAL_INFO_INTEGER property_id, // идентификатор свойства
long value // значение свойства
);

Параметры

property_id

[in] Идентификатор свойства настроек копирования торгового сигнала. Может быть одним из значений перечисления ENUM_SIGNAL_INFO_INTEGER.

value

[in] Значение свойства настроек копирования торгового сигнала.

Возвращаемое значение

Возвращает true в случае успешного изменения свойства, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().


SignalSubscribe

Справочник MQL4 / Управление сигналами / SignalSubscribe

SignalSubscribe

Производит подписку на копирование указанного торгового сигнала.

bool SignalSubscribe(
long signal_id // id сигнала
);

Параметры

signal_id

[in] Идентификатор сигнала.

Возвращаемое значение

Возвращает true в случае успешной подписки на копирование торгового сигнала, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().


SignalUnsubscribe

Справочник MQL4 / Управление сигналами / SignalUnsubscribe

SignalUnsubscribe

Отменяет подписку на копирование торгового сигнала.

bool SignalUnsubscribe();

Возвращаемое значение

Возвращает true в случае успешной отмены подписки на копирование торгового сигнала, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().


Глобальные переменные терминала

Справочник MQL4 / Глобальные переменные терминала

Глобальные переменные клиентского терминала

Группа функций, предназначенных для работы с глобальными переменными.

Не следует путать глобальные переменные клиентского терминала с переменными, объявленными на глобальном уровне mql4-программы.

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

Глобальные переменные клиентского терминала доступны одновременно из всех mql4-программ, запущенных на клиентском терминале.

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

Функция | Действие
GlobalVariableCheck | Проверяет существование глобальной переменной с указанным именем
GlobalVariableTime | Возвращает время последнего доступа к глобальной переменной
GlobalVariableDel | Удаляет глобальную переменную
GlobalVariableGet | Запрашивает значение глобальной переменной
GlobalVariableName | Возвращает имя глобальной переменной по порядковому номеру в списке глобальных переменных
GlobalVariableSet | Устанавливает новое значение глобальной переменной
GlobalVariablesFlush | Принудительно записывает содержимое всех глобальных переменных на диск
GlobalVariableTemp | Устанавливает новое значение глобальной переменной, которая существует только на время текущего сеанса работы терминала
GlobalVariableSetOnCondition | Устанавливает новое значение существующей глобальной переменной по условию
GlobalVariablesDeleteAll | Удаляет глобальные переменные с указанным префиксом в имени
GlobalVariablesTotal | Возвращает общее количество глобальных переменных


GlobalVariableCheck

Справочник MQL4 / Глобальные переменные терминала / GlobalVariableCheck

GlobalVariableCheck

Проверяет существование глобальной переменной клиентского терминала.

bool GlobalVariableCheck(
string name // имя
);

Параметры

name

[in] Имя глобальной переменной.

Возвращаемое значение

Возвращает значение true, если глобальная переменная существует, иначе возвращает false.

Примечание

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

Смотри также

GlobalVariableTime()


GlobalVariableTime

Справочник MQL4 / Глобальные переменные терминала / GlobalVariableTime

GlobalVariableTime

Возвращает время последнего доступа к глобальной переменной.

datetime GlobalVariableTime(
string name // имя
);

Параметры

name

[in] Имя глобальной переменной.

Возвращаемое значение

Возвращает время последнего доступа к указанной глобальной переменной. Обращение к переменной за значением, например, с помощью функций GlobalVariableGet() и GlobalVariableCheck(), также изменяет время последнего доступа. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

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

Смотри также

GlobalVariableCheck()


GlobalVariableDel

Справочник MQL4 / Глобальные переменные терминала / GlobalVariableDel

GlobalVariableDel

Удаляет глобальную переменную клиентского терминала.

bool GlobalVariableDel(
string name // имя
);

Параметры

name

[in] Имя глобальной переменной.

Возвращаемое значение

При успешном удалении функция возвращает true, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

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


GlobalVariableGet

Справочник MQL4 / Глобальные переменные терминала / GlobalVariableGet

GlobalVariableGet

Возвращает значение существующей глобальной переменной клиентского терминала. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

double GlobalVariableGet(
string name // имя
);

2. Возвращает true или false в зависимости от успешности выполнения функции. В случае успеха значение глобальной переменной клиентского терминала помещается в приемную переменную, передаваемую по ссылке вторым параметром.

bool GlobalVariableGet(
string name, // имя
double& double_var // сюда примем значение глобальной переменной
);

Параметры

name

[in] Имя глобальной переменной.

double_var

[out] Переменная типа double, принимающая значение, хранящееся в глобальной переменной клиентского терминала.

Возвращаемое значение

Значение существующей глобальной переменной или 0 в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

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


GlobalVariableName

Справочник MQL4 / Глобальные переменные терминала / GlobalVariableName

GlobalVariableName

Возвращает имя глобальной переменной по порядковому номеру.

string GlobalVariableName(
int index // номер в списке глобальных переменных
);

Параметры

index

[in] Порядковый номер в списке глобальных переменных. Должен быть большим или равным 0 и меньшим, чем GlobalVariablesTotal() .

Возвращаемое значение

Имя глобальной переменной по порядковому номеру в списке глобальных переменных. Чтобы получить информацию об ошибке необходимо вызвать функцию функцию GetLastError().

Примечание

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


GlobalVariableSet

Справочник MQL4 / Глобальные переменные терминала / GlobalVariableSet

GlobalVariableSet

Устанавливает новое значение глобальной переменной. Если переменная не существует, то система создает новую глобальную переменную.

datetime GlobalVariableSet(
string name, // имя
double value // устанавлимое значение
);

Параметры

name

[in] Имя глобальной переменной.

value

[in] Новое числовое значение.

Возвращаемое значение

При успешном выполнении функция возвращает время последнего доступа, иначе 0. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

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

Имя глобальной переменной не должно превышать 63 символа. Не допускаются символы вне текущей кодовой страницы (символы, которые не могут быть переведены из Unicode в ANSI, заменяются на символ '?'). Если предполагается распространение программ среди пользователей, имеющих различные кодовые страницы, настоятельно рекомендуется использование латинских символов в именах глобальных переменных.


GlobalVariablesFlush

Справочник MQL4 / Глобальные переменные терминала / GlobalVariablesFlush

GlobalVariablesFlush

Принудительная запись содержимого всех глобальных переменных на диск.

void GlobalVariablesFlush();

Возвращаемое значение

Нет возвращаемого значения.

Примечание

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


GlobalVariableTemp

Справочник MQL4 / Глобальные переменные терминала / GlobalVariableTemp

GlobalVariableTemp

Производит попытку создания временной глобальной переменной. Если переменная не существует, то система создает новую временную глобальную переменную.

bool GlobalVariableTemp(
string name // имя
);

Параметры

name

[in] Имя временной глобальной переменной.

Возвращаемое значение

При успешном выполнении функция возвращает true, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

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

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


GlobalVariableSetOnCondition

Справочник MQL4 / Глобальные переменные терминала / GlobalVariableSetOnCondition

GlobalVariableSetOnCondition

Устанавливает новое значение существующей глобальной переменной, если текущее значение переменной равно значению третьего параметра check_value. Если переменной не существует, функция сгенерирует ошибку ERR_GLOBALVARIABLE_NOT_FOUND (4501) и вернет false.

bool GlobalVariableSetOnCondition(
string name, // имя
double value, // значение при выполнении условия
double check_value // проверяемое условие
);

Параметры

name

[in] Имя глобальной переменной.

value

[in] Новое значение.

check_value

[in] Значение для проверки текущего значения глобальной переменной.

Возвращаемое значение

При успешном выполнении функция возвращает true, иначе false. Для получения информации об ошибке необходимо вызвать функцию GetLastError(). Если текущее значение глобальной переменной отличается от check_value, функция вернет false.

Примечание

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


GlobalVariablesDeleteAll

Справочник MQL4 / Глобальные переменные терминала / GlobalVariablesDeleteAll

GlobalVariablesDeleteAll

Удаляет глобальные переменные клиентского терминала.

int GlobalVariablesDeleteAll(
string prefix_name=NULL, // все глобальные переменные, чьи имена начинаются с префикса
datetime limit_data=0 // все глобальные переменные, которые изменялись ранее ранее указанной даты
);

Параметры

prefix_name=NULL

[in] Префикс имени удаляемых глобальных переменных. Если указан префикс NULL либо пустая строка, то под критерий удаления соответствуют все глобальные переменные, соответствующие критерию удаления по дате

limit_data=0

[in] Необязательный параметр. Дата для отбора глобальных переменных по времени последней модификации. Удаляются глобальные переменные, которые изменялись ранее указанной даты. Если параметр равен нулю, то удаляются все глобальные переменные, соответствующие первому критерию (по префиксу).

Возвращаемое значение

Количество удаленных переменных.

Примечание

Если оба параметра равны нулю (prefix_name=NULL и limit_data=0), то удаляются все глобальные переменные терминала. Если указаны оба параметра, то удаляются глобальные переменные, соответствующие одновременно каждому из указанных параметров.

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


GlobalVariablesTotal

Справочник MQL4 / Глобальные переменные терминала / GlobalVariablesTotal

GlobalVariablesTotal

Возвращает общее количество глобальных переменных клиентского терминала.

int GlobalVariablesTotal();

Возвращаемое значение

Количество глобальных переменных.

Примечание

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


Файловые операции

Справочник MQL4 / Файловые операции

Файловые операции

Группа функций для работы с файлами.

Из соображений безопасности в языке MQL4 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL4, не могут находиться за пределами файловой "песочницы".

Существует два каталога (с подкаталогами), в которых могут располагаться рабочие файлы:

  • папка_данных_терминала\MQL4\Files\ (выберите для просмотра в терминале пункт меню "Файл"-"Открыть каталог данных");
  • общая папка всех установленных на компьютере терминалов – обычно расположена в каталоге C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common\Files.

Программным путем можно получить наименования этих каталогов с помощью функции TerminalInfoString(), используя перечисление ENUM_TERMINAL_INFO_STRING:

//--- Папка, в которой хранятся данные терминала
string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
//--- Общая папка всех клиентских терминалов
string common_data_path=TerminalInfoString(TERMINAL_COMMONDATA_PATH);

Работа с файлами из других каталогов пресекается.

Файловые функции позволяют работать с так называемыми "именованными каналами". Для этого достаточно вызвать функцию FileOpen() с соответствующими параметрами.

Функция | Действие
FileFindFirst | Начинает перебор файлов в соответствующей директории в соответствии с указанным фильтром
FileFindNext | Продолжает поиск, начатый функцией FileFindFirst()
FileFindClose | Закрывает хэндл поиска
FileOpen | Открывает файл с указанным именем и указанными флагам
FileDelete | Удаляет указанный файл
FileFlush | Сброс на диск всех данных, оставшихся в файловом буфере ввода-вывода
FileGetInteger | Получает целочисленное свойство файла
FileIsEnding | Определяет конец файла в процессе чтения
FileIsLineEnding | Определяет конец строки в текстовом файле в процессе чтения
FileClose | Закрывает ранее открытый файл
FileIsExist | Проверяет существование файла
FileCopy | Копирует исходный файл из локальной или общей папки в другой файл
FileMove | Перемещает или переименовывает файл
FileReadArray | Читает массивы любых типов, кроме строковых (может быть массив структур, не содержащих строки и динамические массивы), из бинарного файла с текущего положения файлового указателя
FileReadBool | Читает из файла типа CSV строку от текущего положения до разделителя (либо до конца текстовой строки) и преобразует прочитанную строку в значение типа bool
FileReadDatetime | Читает из файла типа CSV строку одного из форматов: "YYYY.MM.DD HH:MM:SS", "YYYY.MM.DD" или "HH:MM:SS" - и преобразует ее в значение типа datetime
FileReadDouble | Читает число двойной точности с плавающей точкой (double) из бинарного файла с текущего положения файлового указателя
FileReadFloat | Читает из текущего положения файлового указателя значение типа float
FileReadInteger | Читает из бинарного файла значение типа int, short или char в зависимости от указанной длины в байтах
FileReadLong | Читает из текущего положения файлового указателя значение типа long
FileReadNumber | Читает из файла типа CSV строку от текущего положения до разделителя (либо до конца текстовой строки) и преобразует прочитанную строку в значение типа double
FileReadString | Читает из файла строку с текущего положения файлового указателя
FileReadStruct | Cчитывает из бинарного файла содержимое в структуру, переданную в качестве параметра
FileSeek | Перемещает положение файлового указателя на указанное количество байт относительно указанного положения
FileSize | Возвращает размер соответствующего открытого файла
FileTell | Возвращает текущее положение файлового указателя соответствующего открытого файла
FileWrite | Записывает данные в файл типа CSV или TXT
FileWriteArray | Записывает в файл типа BIN массивы любых типов, кроме строковых
FileWriteDouble | Записывает в двоичный файл значение параметра типа double с текущего положения файлового указателя
FileWriteFloat | Записывает в двоичный файл значение параметра типа float с текущего положения файлового указателя
FileWriteInteger | Записывает в двоичный файл значение параметра типа int с текущего положения файлового указателя
FileWriteLong | Записывает в двоичный файл значение параметра типа long с текущего положения файлового указателя
FileWriteString | Записывает в файл типа BIN или TXT значение параметра типа string с текущего положения файлового указателя
FileWriteStruct | Записывает в двоичный файл содержимое структуры, переданной в качестве параметра, с текущего положения файлового указателя
FolderCreate | Создает директорию в папке Files (в зависимости от значения common_flag)
FolderDelete | Удаляет указанную директорию. Если папка не пуста, то она не может быть удалена
FolderClean | Удаляет все файлы в указанной папке
FileOpenHistory | Открывает файл в текущей папке истории или ее подпапках

Если файл открывается для записи с помощью функции FileOpen(), то все указанные в пути подпапки будут созданы в случае их отсутствия.


FileFindFirst

Справочник MQL4 / Файловые операции / FileFindFirst

FileFindFirst

Начинает перебор файлов и поддиректорий в соответствующей директории в соответствии с указанным фильтром.

long FileFindFirst(
const string file_filter, // строка - фильтр поиска
string& returned_filename, // имя найденного файла или поддиректории
int common_flag=0 // определяет область поиска
);

Параметры

file_filter

[in] Фильтр поиска. В фильтре может быть указана поддиректория (или последовательность вложенных поддиректорий) относительно директории \Files, в которой необходимо проводить перебор файлов.

returned_filename

[out] Возвращаемый параметр, куда в случае удачи помещается имя первого найденного файла или поддиректории. Возвращается только имя файла (включая расширение) без указания директорий и поддиректорий, независимо от того, указывались ли они в фильтре для поиска.

common_flag

[in] Флаг, определяющий местоположение файла. Если common_flag=FILE_COMMON, то файл находится в общей папке всех клиентских терминалов \Terminal\Common\Files. В противном случае файл находится в локальной папке.

Возвращаемое значение

Возвращает хэндл объекта поиска, который необходимо использовать для дальнейшего перебора файлов и поддиректорий функцией FileFindNext(), либо INVALID_HANDLE в случае, когда нет ни одного файла и поддиректории, соответствующего фильтру (в частном случае – директория пуста). После окончания поиска хэндл необходимо закрыть при помощи функции FileFindClose().

Примечание

Из соображений безопасности в языке MQL4 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL4, не могут находиться за пределами файловой "песочницы".

Пример:

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- фильтр
input string InpFilter="Dir1\\*";
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string file_name;
string int_dir="";
int i=1,pos=0,last_pos=-1;
//--- ищем последний бэк-слеш
while(!IsStopped())
{
pos=StringFind(InpFilter,"\\",pos+1);
if(pos>=0)
last_pos=pos;
else
break;
}
//--- в фильтре присутствует имя папки
if(last_pos>=0)
int_dir=StringSubstr(InpFilter,0,last_pos+1);
//--- получение хэндла поиска в корне локальной папки
long search_handle=FileFindFirst(InpFilter,file_name);
//--- проверим, успешно ли отработала функция FileFindFirst()
if(search_handle!=INVALID_HANDLE)
{
//--- в цикле проверим являются ли переданные строки именами файлов или директорий
do
{
ResetLastError();
//--- если это файл, то функция вернет true, а если директория, то функция генерирует ошибку ERR_FILE_IS_DIRECTORY
FileIsExist(int_dir+file_name);
PrintFormat("%d : %s name = %s",i,GetLastError()==ERR_FILE_IS_DIRECTORY ? "Directory" : "File",file_name);
i++;
}
while(FileFindNext(search_handle,file_name));
//--- закрываем хэндл поиска
FileFindClose(search_handle);
}
else
Print("Files not found!");
}

Смотри также

FileFindNext(), FileFindClose()


FileFindNext

Справочник MQL4 / Файловые операции / FileFindNext

FileFindNext

Продолжает поиск, начатый функцией FileFindFirst().

bool FileFindNext(
long search_handle, // handle поиска
string& returned_filename // имя найденного файла или поддиректории
);

Параметры

search_handle

[in] Хэндл поиска, полученный функцией FileFindFirst().

returned_filename

[out] Имя следующего найденного файла или поддиректории. Возвращается только имя файла (включая расширение) без указания директорий и поддиректорий, независимо от того, указывались ли они в фильтре для поиска.

Возвращаемое значение

В случае удачи возвращает true, иначе false.

Пример:

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- фильтр
input string InpFilter="*";
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string file_name;
int i=1;
//--- получение хэндла поиска в корне локальной папки
long search_handle=FileFindFirst(InpFilter,file_name);
//--- проверим, успешно ли отработала функция FileFindFirst()
if(search_handle!=INVALID_HANDLE)
{
//--- в цикле проверим являются ли переданные строки именами файлов или директорий
do
{
ResetLastError();
//--- если это файл, то функция вернет true, а если директория, то функция генерирует ошибку ERR_FILE_IS_DIRECTORY
FileIsExist(file_name);
PrintFormat("%d : %s name = %s",i,GetLastError()==ERR_FILE_IS_DIRECTORY ? "Directory" : "File",file_name);
i++;
}
while(FileFindNext(search_handle,file_name));
//--- закрываем хэндл поиска
FileFindClose(search_handle);
}
else
Print("Files not found!");
}

Смотри также

FileFindFirst(), FileFindClose()


FileFindClose

Справочник MQL4 / Файловые операции / FileFindClose

FileFindClose

Закрывает хэндл поиска.

void FileFindClose(
long search_handle // handle поиска
);

Параметры

search_handle

[in] Хэндл поиска, полученный функцией FileFindFirst().

Возвращаемое значение

Нет возвращаемого значения.

Примечание

Функцию необходимо вызывать, чтобы освобождать системные ресурсы.

Пример:

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- фильтр
input string InpFilter="*";
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string file_name;
int i=1;
//--- получение хэндла поиска в корне локальной папки
long search_handle=FileFindFirst(InpFilter,file_name);
//--- проверим, успешно ли отработала функция FileFindFirst()
if(search_handle!=INVALID_HANDLE)
{
//--- в цикле проверим являются ли переданные строки именами файлов или директорий
do
{
ResetLastError();
//--- если это файл, то функция вернет true, а если директория, то функция генерирует ошибку 5018
FileIsExist(file_name);
PrintFormat("%d : %s name = %s",i,GetLastError()==5018 ? "Directory" : "File",file_name);
i++;
}
while(FileFindNext(search_handle,file_name));
//--- закрываем хэндл поиска
FileFindClose(search_handle);
}
else
Print("Files not found!");
}

Смотри также

FileFindFirst(), FileFindNext()


FileIsExist

Справочник MQL4 / Файловые операции / FileIsExist

FileIsExist

Проверяет существование файла.

bool FileIsExist(
const string file_name, // имя файла
int common_flag=0 // зона поиска
);

Параметры

file_name

[in] Имя проверяемого файла.

common_flag=0

[in] Флаг, определяющий местоположение файла. Если common_flag=FILE_COMMON, то файл находится в общей папке всех клиентских терминалов \Terminal\Common\Files. В противном случае файл находится в локальной папке.

Возвращаемое значение

Возвращает true, если указанный файл существует.

Примечание

Проверяемый файл может оказаться поддиректорией. В этом случае функция FileIsExist() возвратит false, а в переменную _LastError будет записана ошибка 5019 - "Это не файл, а директория" (смотрите пример для функции FileFindFirst).

Из соображений безопасности в языке MQL4 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL4, не могут находиться за пределами файловой "песочницы".

Если common_flag=FILE_COMMON, то функция ищет указанный файл в общей папке всех клиентских терминалов \Terminal\Common\Files, в противном случае функция ищет файл в локальной папке (MQL4\Files или MQL4\Tester\Files в случае тестирования).

Пример:

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- дата для старых файлов
input datetime InpFilesDate=D'2013.01.01 00:00';
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string file_name; // переменная для хранения имен файлов
string filter="*.txt"; // фильтр для поиска файлов
datetime create_date; // дата создания файла
string files[]; // список имен файлов
int def_size=25; // размер массива по умолчанию
int size=0; // количество файлов
//--- выдели память для массива
ArrayResize(files,def_size);
//--- получение хэндла поиска в корне локальной папки
long search_handle=FileFindFirst(filter,file_name);
//--- проверим, успешно ли отработала функция FileFindFirst()
if(search_handle!=INVALID_HANDLE)
{
//--- в цикле перебираем файлы
do
{
files[size]=file_name;
//--- увеличим размер массива
size++;
if(size==def_size)
{
def_size+=25;
ArrayResize(files,def_size);
}
//--- сбрасываем значение ошибки
ResetLastError();
//--- получим дату создания файла
create_date=(datetime)FileGetInteger(file_name,FILE_CREATE_DATE,false);
//--- проверим, старый ли файл
if(create_date<InpFilesDate)
{
PrintFormat("Файл %s удален!",file_name);
//--- удаляем старый файл
FileDelete(file_name);
}
}
while(FileFindNext(search_handle,file_name));
//--- закрываем хэндл поиска
FileFindClose(search_handle);
}
else
{
Print("Files not found!");
return;
}
//--- проверим какие из файлов остались
PrintFormat("Результаты:");
for(int i=0;i<size;i++)
{
if(FileIsExist(files[i]))
PrintFormat("Файл %s существует!",files[i]);
else
PrintFormat("Файл %s удален!",files[i]);
}
}

Смотри также

FileFindFirst()


FileOpen

Справочник MQL4 / Файловые операции / FileOpen

FileOpen

Функция открывает файл с указанным именем и указанными флагами.

int FileOpen(
string file_name, // имя файла
int open_flags, // комбинация флагов
short delimiter=';', // разделитель
uint codepage=CP_ACP // кодовая страница
);

Параметры

file_name

[in] Имя открываемого файла, может содержать подпапки. Если файл открывается для записи, то указанные подпапки будут созданы в случае их отсутствия.

open_flags

[in] комбинация флагов, определяющая режим работы с файлом. Флаги определены следующим образом:
FILE_READ файл открывается для чтения
FILE_WRITE файл открывается для записи
FILE_BIN двоичный режим чтения-записи (без преобразования из строки и в строку)
FILE_CSV файл типа csv (все записанные элементы преобразуются к строкам соответствующего типа, unicode или ansi, и разделяются разделителем)
FILE_TXT простой текстовый файл (тот же csv, однако разделитель не принимается во внимание)
FILE_ANSI строки типа ANSI (однобайтовые символы)
FILE_UNICODE строки типа UNICODE (двухбайтовые символы)
FILE_SHARE_READ совместный доступ по чтению со стороны нескольких программ
FILE_SHARE_WRITE совместный доступ по записи со стороны нескольких программ
FILE_COMMON расположение файла в общей папке всех клиентских терминалов \Terminal\Common\Files

delimiter=';'

[in] значение, используемое в качестве разделителя в txt или csv-файле. Если для csv-файла разделитель не указан, то по умолчанию используется ";". Если для txt-файла разделитель не указан, то никакой разделитель не используется. Если в качестве разделителя явно задано значение 0, то никакой разделитель не используется.

codepage=CP_ACP

[in] Необязательный параметр. Значение кодовой страницы. Для наиболее употребимых кодовых страниц предусмотрены соответствующие константы.

Возвращаемое значение

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

Примечание

Из соображений безопасности в языке MQL4 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL4, не могут находиться за пределами файловой "песочницы".

Файл открывается в папке клиентского терминала в подпапке MQL4\Files (или Tester\Files в случае тестирования). Если среди флагов указан FILE_COMMON, то файл открывается в общей папке всех клиентских терминалов \Terminal\Common\Files.

Можно открывать "именованные каналы" по следующим правилам:

  • Имя канала - строка, которая должна иметь вид: "\\servername\pipe\pipename", где servername - имя сервера в сети, а pipename - имя канала. Если каналы используются на одном и том же компьютере, имя сервера может быть опущено, но вместо него нужно поставить точку: "\\.\pipe\pipename". Клиент, который пытается соединиться с каналом, должен знать его имя.
  • Необходимо вызывать FileFlush() и FileSeek() на начало файла между последовательными операциями чтения из канала и записи в канал.

В приведенных строках используется специальный символ обратная косая черта '\', поэтому при написании имени в MQL4 программе '\' необходимо удваивать, то есть вышеприведенный пример написать в коде как "\\\\servername\\pipe\\pipename".

Более подробно о работе с именованными каналами можно прочитать в статье "Связь с MetaTrader 5 через именованные каналы без применения DLL"

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- неправильный способ открытия файла
string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
string filename=terminal_data_path+"\\MQL4\\Files\\"+"fractals.csv";
int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
if(filehandle<0)
{
Print("Неудачная попытка открыть файл по абсолютному пути");
Print("Код ошибки ",GetLastError());
}
//--- правильный способ работы в "файловой песочнице"
ResetLastError();
filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
if(filehandle!=INVALID_HANDLE)
{
FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(ENUM_TIMEFRAMES(_Period)));
FileClose(filehandle);
Print("FileOpen OK");
}
else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
//--- еще один пример с созданием вложенной директории в MQL4\Files\
string subfolder="Research";
filehandle=FileOpen(subfolder+"\\fractals.txt",FILE_WRITE|FILE_CSV);
if(filehandle!=INVALID_HANDLE)
{
FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(ENUM_TIMEFRAMES(_Period)));
FileClose(filehandle);
Print("Файл должен быть создан в папке "+terminal_data_path+"\\"+subfolder);
}
else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
}

Смотри также

Использование кодовой страницы, FileFindFirst(), FolderCreate(), Флаги открытия файлов


FileClose

Справочник MQL4 / Файловые операции / FileClose

FileClose

Закрытие файла, ранее открытого функцией FileOpen().

void FileClose(
int file_handle // handle файла
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

Возвращаемое значение

Нет возвращаемого значения.

Пример:

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input string InpFileName="file.txt"; // имя файла
input string InpDirectoryName="Data"; // имя директории
input int InpEncodingType=FILE_ANSI; // ANSI=32 или UNICODE=64
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- распечатаем путь к папке в которой будем работать
PrintFormat("Работаем в папке %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- сбросим значение ошибки
ResetLastError();
//--- откроем файл для чтения (если файл не существует, то произойдет ошибка)
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
//--- распечатаем содержимое файла
while(!FileIsEnding(file_handle))
Print(FileReadString(file_handle));
//--- закрываем файл
FileClose(file_handle);
}
else
PrintFormat("Ошибка, код = %d",GetLastError());
}


FileCopy

Справочник MQL4 / Файловые операции / FileCopy

FileCopy

Копирует исходный файл из локальной или общей папки в другой файл.

bool FileCopy(
const string src_file_name, // имя файла источника
int common_flag, // расположение файла
const string dst_file_name, // имя файла назначения
int mode_flags // способ доступа и/или расположение файла
);

Параметры

src_file_name

[in] Имя файла для копирования.

common_flag

[in] Флаг, определяющий местоположение файла. Если common_flag=FILE_COMMON, то файл находится в общей папке всех клиентских терминалов \Terminal\Common\Files. В противном случае файл находится в локальной папке (например, common_flag=0).

dst_file_name

[in] Имя результатного файла.

mode_flags

[in] Флаги доступа. Параметр может содержать только 2 флага: FILE_REWRITE и/или FILE_COMMON - остальные флаги игнорируются. Если файл уже существует и при этом не был указан флаг FILE_REWRITE, то файл не будет переписан, и функция возвратит false.

Возвращаемое значение

В случае неудачи функция возвращает false.

Примечание

Из соображений безопасности в языке MQL4 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL4, не могут находиться за пределами файловой "песочницы".

Если новый файл существовал, то копирование будет производиться в зависимости от наличия флага FILE_REWRITE в значении параметра mode_flags.

Пример:

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input string InpSrc="source.txt"; // источник
input string InpDst="destination.txt"; // копия
input int InpEncodingType=FILE_ANSI; // ANSI=32 или UNICODE=64
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- отобразим содержимое источника (он должен существовать)
if(!FileDisplay(InpSrc))
return;
//--- проверим, существует ли уже файл копии (не обязан быть создан)
if(!FileDisplay(InpDst))
{
//--- файл копии не существует, копирование без флага FILE_REWRITE (правильное копирование)
if(FileCopy(InpSrc,0,InpDst,0))
Print("File is copied!");
else
Print("File is not copied!");
}
else
{
//--- файл копии уже существует, попробуем скопировать без флага FILE_REWRITE (неправильное копирование)
if(FileCopy(InpSrc,0,InpDst,0))
Print("File is copied!");
else
Print("File is not copied!");
//--- содержимое файла InpDst останется прежним
FileDisplay(InpDst);
//--- скопируем еще раз с флагом FILE_REWRITE (правильное копирование при существовании файла)
if(FileCopy(InpSrc,0,InpDst,FILE_REWRITE))
Print("File is copied!");
else
Print("File is not copied!");
}
//--- получили копию файла InpSrc
FileDisplay(InpDst);
}
//+------------------------------------------------------------------+
//| Чтение содержимого файла |
//+------------------------------------------------------------------+
bool FileDisplay(const string file_name)
{
//--- сбросим значение ошибки
ResetLastError();
//--- откроем файл
int file_handle=FileOpen(file_name,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
//--- отобразим в цикле содержимое файла
Print("+---------------------+");
PrintFormat("File name = %s",file_name);
while(!FileIsEnding(file_handle))
Print(FileReadString(file_handle));
Print("+---------------------+");
//--- закроем файл
FileClose(file_handle);
return(true);
}
//--- не удалось открыть файл
PrintFormat("%s is not opened, error = %d",file_name,GetLastError());
return(false);
}


FileDelete

Справочник MQL4 / Файловые операции / FileDelete

FileDelete

Удаляет указанный файл в локальной папке клиентского терминала.

bool FileDelete(
const string file_name, // имя удаляемого файла
int common_flag=0 // местоположение удаляемого файла
);

Параметры

file_name

[in] Имя файла.

common_flag=0

[in] Флаг, определяющий местоположение файла. Если common_flag=FILE_COMMON, то файл находится в общей папке всех клиентских терминалов \Terminal\Common\Files. В противном случае файл находится в локальной папке.

Возвращаемое значение

В случае неудачи функция возвращает false.

Примечание

Из соображений безопасности в языке MQL4 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL4, не могут находиться за пределами файловой "песочницы".

Удаляет указанный файл в локальной папке клиентского терминала (MQL4\Files или MQL4\Tester\Files в случае тестирования). Если же указан common_flag=FILE_COMMON, то функция удаляет файл из общей папки всех клиентских терминалов.

Пример:

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- дата для старых файлов
input datetime InpFilesDate=D'2013.01.01 00:00';
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string file_name; // переменная для хранения имен файлов
string filter="*.txt"; // фильтр для поиска файлов
datetime create_date; // дата создания файла
string files[]; // список имен файлов
int def_size=25; // размер массива по умолчанию
int size=0; // количество файлов
//--- выдели память для массива
ArrayResize(files,def_size);
//--- получение хэндла поиска в корне локальной папки
long search_handle=FileFindFirst(filter,file_name);
//--- проверим, успешно ли отработала функция FileFindFirst()
if(search_handle!=INVALID_HANDLE)
{
//--- в цикле перебираем файлы
do
{
files[size]=file_name;
//--- увеличим размер массива
size++;
if(size==def_size)
{
def_size+=25;
ArrayResize(files,def_size);
}
//--- сбрасываем значение ошибки
ResetLastError();
//--- получим дату создания файла
create_date=(datetime)FileGetInteger(file_name,FILE_CREATE_DATE,false);
//--- проверим, старый ли файл
if(create_date<InpFilesDate)
{
PrintFormat("Файл %s удален!",file_name);
//--- удаляем старый файл
FileDelete(file_name);
}
}
while(FileFindNext(search_handle,file_name));
//--- закрываем хэндл поиска
FileFindClose(search_handle);
}
else
{
Print("Files not found!");
return;
}
//--- проверим какие из файлов остались
PrintFormat("Результаты:");
for(int i=0;i<size;i++)
{
if(FileIsExist(files[i]))
PrintFormat("Файл %s существует!",files[i]);
else
PrintFormat("Файл %s удален!",files[i]);
}
}


FileMove

Справочник MQL4 / Файловые операции / FileMove

FileMove

Перемещает файл из локальной или общей папки в другую папку.

bool FileMove(
const string src_file_name, // имя файла для операции перемещения
int common_flag, // расположение файла
const string dst_file_name, // имя файла назначения
int mode_flags // способ доступа и/или расположение файла
);

Параметры

src_file_name

[in] Имя файла для перемещения/переименования.

common_flag

[in] Флаг, определяющий местоположение файла. Если common_flag=FILE_COMMON, то файл находится в общей папке всех клиентских терминалов \Terminal\Common\Files. В противном случае файл находится в локальной папке (common_flag=0).

dst_file_name

[in] Имя результатного файла.

mode_flags

[in] Флаги доступа. Параметр может содержать только 2 флага: FILE_REWRITE и/или FILE_COMMON - остальные флаги игнорируются. Если файл уже существует и при этом не был указан флаг FILE_REWRITE, то файл не будет переписан, и функция возвратит false.

Возвращаемое значение

В случае неудачи функция возвращает false.

Примечание

Из соображений безопасности в языке MQL4 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL4, не могут находиться за пределами файловой "песочницы".

Если новый файл существовал, то копирование будет производиться в зависимости от наличия флага FILE_REWRITE в значении параметра mode_flags.

Пример:

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input string InpSrcName="data.txt";
input string InpDstName="newdata.txt";
input string InpSrcDirectory="SomeFolder";
input string InpDstDirectory="OtherFolder";
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string local=TerminalInfoString(TERMINAL_DATA_PATH);
string common=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//--- получим пути к файлам
string src_path=InpSrcDirectory+"//"+InpSrcName;
string dst_path=InpDstDirectory+"//"+InpDstName;
//--- проверим, существуют ли файл источника (если нет - выход)
if(FileIsExist(src_path))
PrintFormat("%s file exists in the %s\\Files\\%s folder",InpSrcName,local,InpSrcDirectory);
else
{
PrintFormat("Error, %s source file not found",InpSrcName);
return;
}
//--- проверим, существует ли уже файл результата
if(FileIsExist(dst_path,FILE_COMMON))
{
PrintFormat("%s file exists in the %s\\Files\\%s folder",InpDstName,common,InpDstDirectory);
//--- файл существует, перемещение нужно проводить с флагом FILE_REWRITE
ResetLastError();
if(FileMove(src_path,0,dst_path,FILE_COMMON|FILE_REWRITE))
PrintFormat("%s file moved",InpSrcName);
else
PrintFormat("Error! Code = %d",GetLastError());
}
else
{
PrintFormat("%s file does not exist in the %s\\Files\\%s folder",InpDstName,common,InpDstDirectory);
//--- файл не существует, перемещение нужно проводить без флага FILE_REWRITE
ResetLastError();
if(FileMove(src_path,0,dst_path,FILE_COMMON))
PrintFormat("%s file moved",InpSrcName);
else
PrintFormat("Error! Code = %d",GetLastError());
}
//--- теперь файл перемещен, проверим это
if(FileIsExist(dst_path,FILE_COMMON) && !FileIsExist(src_path,0))
Print("Success!");
else
Print("Error!");
}

Смотри также

FileIsExist()


FileFlush

Справочник MQL4 / Файловые операции / FileFlush

FileFlush

Сброс на диск всех данных, оставшихся в файловом буфере ввода-вывода.

void FileFlush(
int file_handle // handle файла
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

Возвращаемое значение

Нет возвращаемого значения.

Примечание

При выполнении операции записи в файл физически данные могут оказаться в нем только через некоторое время. Для того чтобы данные сразу же сохранились в файле, нужно использовать функцию FileFlush(). Если не использовать функцию, то часть данных, еще не попавших на диск, принудительно записывается туда только при закрытии файла функцией FileClose().

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

Функцию FileFlush() необходимо вызывать между операциями чтения из файла и записи в файл.

Пример:

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- имя файла для записи
input string InpFileName="example.csv"; // имя файла
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- сбросим значение ошибки
ResetLastError();
//--- откроем файл
int file_handle=FileOpen(InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
if(file_handle!=INVALID_HANDLE)
{
//--- запишем данные в файл
for(int i=0;i<1000;i++)
{
//--- вызовем функцию записи
FileWrite(file_handle,TimeCurrent(),SymbolInfoDouble(Symbol(),SYMBOL_BID),SymbolInfoDouble(Symbol(),SYMBOL_ASK));
//--- сбрасываем данные на диск на каждой 128 итерации
if((i & 127)==127)
{
//--- теперь данные будут находиться в файле, и при критической ошибке терминала мы их не потеряем
FileFlush(file_handle);
PrintFormat("i = %d, OK",i);
}
//--- задержка в 0.01 секунды
Sleep(10);
}
//--- закрываем файл
FileClose(file_handle);
}
else
PrintFormat("Ошибка, код = %d",GetLastError());
}

Смотри также

FileClose()


FileGetInteger

Справочник MQL4 / Файловые операции / FileGetInteger

FileGetInteger

Получает целочисленное свойство файла. Существует 2 варианта функции.

1. Получение свойств по хэндлу файла.

long FileGetInteger(
int file_handle, // хэндл файла
ENUM_FILE_PROPERTY_INTEGER property_id // идентификатор свойства
);

2. Получение свойств по имени файла.

long FileGetInteger(
const string file_name, // имя файла
ENUM_FILE_PROPERTY_INTEGER property_id, // идентификатор свойства
bool common_folder=false // файл просматривается в локальной папке (false)
); // или в общей папке всех терминалов (true)

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

file_name

[in] Имя файла.

property_id

[in] Идентификатор свойства файла. Значение может быть одним из значений перечисления ENUM_FILE_PROPERTY_INTEGER. Если используется второй вариант функции, то можно получать значения только следующих свойств: FILE_EXISTS, FILE_CREATE_DATE, FILE_MODIFY_DATE, FILE_ACCESS_DATE и FILE_SIZE.

common_folder=false

[in] Указывает на местоположение файла. Если параметр равен false, то просматривается каталог данных терминала, в противном случае предполагается, что файл находится в общей папке всех клиентских терминалов \Terminal\Common\Files (FILE_COMMON).

Возвращаемое значение

Значение свойства. В случае ошибки функция возвращает -1, для получения кода ошибки необходимо вызвать функцию GetLastError().

Если при получении свойств по имени будет указан каталог, то функция в любом случае выставит ошибку 5018 (ERR_MQL_FILE_IS_DIRECTORY), при этом возвращаемое значение будет корректным.

Примечание

Функция всегда изменяет код ошибки. При успешном завершении код ошибки сбрасывается в ноль.

Пример:

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input string InpFileName="data.csv";
input string InpDirectoryName="SomeFolder";
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string path=InpDirectoryName+"//"+InpFileName;
long l=0;
//--- откроем файл
ResetLastError();
int handle=FileOpen(path,FILE_READ|FILE_CSV);
if(handle!=INVALID_HANDLE)
{
//--- распечатаем всю информацию о файле
Print(InpFileName," file info:");
FileInfo(handle,FILE_EXISTS,l,"bool");
FileInfo(handle,FILE_CREATE_DATE,l,"date");
FileInfo(handle,FILE_MODIFY_DATE,l,"date");
FileInfo(handle,FILE_ACCESS_DATE,l,"date");
FileInfo(handle,FILE_SIZE,l,"other");
FileInfo(handle,FILE_POSITION,l,"other");
FileInfo(handle,FILE_END,l,"bool");
FileInfo(handle,FILE_IS_COMMON,l,"bool");
FileInfo(handle,FILE_IS_TEXT,l,"bool");
FileInfo(handle,FILE_IS_BINARY,l,"bool");
FileInfo(handle,FILE_IS_CSV,l,"bool");
FileInfo(handle,FILE_IS_ANSI,l,"bool");
FileInfo(handle,FILE_IS_READABLE,l,"bool");
FileInfo(handle,FILE_IS_WRITABLE,l,"bool");
//--- закроем файл
FileClose(handle);
}
else
PrintFormat("%s file is not opened, ErrorCode = %d",InpFileName,GetLastError());
}
//+------------------------------------------------------------------+
//| Отображение значения свойства файла |
//+------------------------------------------------------------------+
void FileInfo(const int handle,const ENUM_FILE_PROPERTY_INTEGER id,
long l,const string type)
{
//--- получим значение свойства
ResetLastError();
if((l=FileGetInteger(handle,id))!=-1)
{
//--- значение получено, отобразим его в правильном формате
if(!StringCompare(type,"bool"))
Print(EnumToString(id)," = ",l ? "true" : "false");
if(!StringCompare(type,"date"))
Print(EnumToString(id)," = ",(datetime)l);
if(!StringCompare(type,"other"))
Print(EnumToString(id)," = ",l);
}
else
Print("Error, Code = ",GetLastError());
}

Смотри также

Файловые операции, Свойства файлов


FileIsEnding

Справочник MQL4 / Файловые операции / FileIsEnding

FileIsEnding

Определяет конец файла в процессе чтения.

bool FileIsEnding(
int file_handle // handle файла
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

Возвращаемое значение

Функция возвращает true в случае, если в процессе чтения или перемещения файлового указателя достигнут конец файла.

Примечание

Для определения конца файла, функция пытается провести чтение следующей строки из файла. Если ее не существует, то функция возвращает true, в противном случае false.

Пример:

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input string InpFileName="file.txt"; // имя файла
input string InpDirectoryName="Data"; // имя директории
input int InpEncodingType=FILE_ANSI; // ANSI=32 или UNICODE=64
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- распечатаем путь к папке в которой будем работать
PrintFormat("Работаем в папке %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- сбросим значение ошибки
ResetLastError();
//--- откроем файл для чтения (если файл не существует, то произойдет ошибка)
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
//--- распечатаем содержимое файла
while(!FileIsEnding(file_handle))
Print(FileReadString(file_handle));
//--- закрываем файл
FileClose(file_handle);
}
else
PrintFormat("Ошибка, код = %d",GetLastError());
}


FileIsLineEnding

Справочник MQL4 / Файловые операции / FileIsLineEnding

FileIsLineEnding

Определяет конец строки в текстовом файле в процессе чтения.

bool FileIsLineEnding(
int file_handle // handle файла
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

Возвращаемое значение

Возвращает true в случае, если в процессе чтения txt или csv-файла достигнут конец строки (символы CR-LF).

Пример (используется файл, полученный в результате работы примера для функции FileWriteString)

//+------------------------------------------------------------------+
//| Demo_FileIsLineEnding.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//--- параметры для чтения данных
input string InpFileName="RSI.csv"; // имя файла
input string InpDirectoryName="Data"; // имя директории
//--- переменные перекупленности
int ovb_size=0;
datetime ovb_time[];
//--- переменные перепроданности
int ovs_size=0;
datetime ovs_time[];
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- откроем файл
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_CSV|FILE_ANSI,"\t");
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для чтения",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
double value;
//--- читаем данные из файла
while(!FileIsEnding(file_handle))
{
//--- читаем первое значение в строке
value=FileReadNumber(file_handle);
//--- читаем в разные массивы в зависимости от результата функции
if(value>=70)
ReadData(file_handle,ovb_time,ovb_size);
else
ReadData(file_handle,ovs_time,ovs_size);
}
//--- закроем файл
FileClose(file_handle);
PrintFormat("Данные прочитаны, файл %s закрыт",InpFileName);
//--- выводим содержимое прочитанных массивов времени
PrintFormat("Overbought=%d",ovb_size);
for(int i=0; i<ovb_size; i++) Print(i," time=",TimeToString(ovb_time[i]));
PrintFormat("Oversold=%d",ovs_size);
for(int i=0; i<ovs_size; i++) Print(i," time=",TimeToString(ovs_time[i]));
}
else
{
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
return;
}
//---
}
//+------------------------------------------------------------------+
//| Чтение данных строки файла |
//+------------------------------------------------------------------+
void ReadData(const int file_handle,datetime &arr[],int &size)
{
bool flag=false;
//--- читаем пока не дойдем до конца строки или файла
string str="";
while(!FileIsLineEnding(file_handle) && !FileIsEnding(file_handle))
{
//--- сдвинем каретку, прочитав число
if(flag)
FileReadNumber(file_handle);
size++;
//--- при необходимости увеличим размер массива
if(size>ArraySize(arr)) ArrayResize(arr,size,100);
//--- запоминаем текущую дату
arr[size-1]=FileReadDatetime(file_handle);
//--- добавляем в строку
str+=" "+TimeToString(arr[size-1]);
//--- проскочили первую итерацию
flag=true;
}
Print(str);
}

Смотри также

FileWriteString()


FileReadArray

Справочник MQL4 / Файловые операции / FileReadArray

FileReadArray

Читает массивы любых типов, кроме строковых (может быть массив структур, не содержащих строки и динамические массивы), из бинарного файла с текущего положения файлового указателя.

uint FileReadArray(
int file_handle, // handle файла
void& array[], // массив для записи
int start=0, // стартовая позиция для записи в массив
int count=WHOLE_ARRAY // сколько читать
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

array[]

[out] Массив, куда данные будут загружены.

start=0

[in] Стартовая позиция позиция для чтения из массива.

count=WHOLE_ARRAY

[in] Количество элементов для чтения.

Возвращаемое значение

Количество прочитанных элементов или 0 в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). По умолчанию читает весь массив (count=WHOLE_ARRAY).

Примечание

Строковый массив может читаться только из файла типа TXT. При необходимости функция пытается увеличить размер массива.

Пример (используется файл, полученный в результате работы примера для функции FileWriteArray())

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input string InpFileName="data.bin";
input string InpDirectoryName="SomeFolder";
//+------------------------------------------------------------------+
//| Структура для хранения данных о ценах |
//+------------------------------------------------------------------+
struct prices
{
datetime date; // дата
double bid; // цена бид
double ask; // цена аск
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- массив структуры
prices arr[];
//--- путь к файлу
string path=InpDirectoryName+"//"+InpFileName;
//--- откроем файл
ResetLastError();
int file_handle=FileOpen(path,FILE_READ|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
//--- прочитаем все данные из файла в массив
FileReadArray(file_handle,arr);
//--- получим размер массива
int size=ArraySize(arr);
//--- распечатаем данные из массива
for(int i=0;i<size;i++)
Print("Date = ",arr[i].date," Bid = ",arr[i].bid," Ask = ",arr[i].ask);
Print("Total data = ",size);
//--- закрываем файл
FileClose(file_handle);
}
else
Print("File open failed, error ",GetLastError());
}

Смотри также

Переменные, FileWriteArray()


FileReadBool

Справочник MQL4 / Файловые операции / FileReadBool

FileReadBool

Читает из файла типа CSV строку от текущего положения до разделителя (либо до конца текстовой строки) и преобразует прочитанную строку в значение типа bool.

bool FileReadBool(
int file_handle // handle файла
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

Возвращаемое значение

Прочитанная строка может иметь значения "true", "false" или символьное представление целых чисел "0" или "1". Ненулевое значение преобразуется к логическому true. Функция возвращает полученное преобразованное значение.

Пример (используется файл, полученный в результате работы примера для функции FileWrite())

//+------------------------------------------------------------------+
//| Demo_FileReadBool.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
//---- plot Label1
#property indicator_label1 "UpSignal"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 4
//---- plot Label2
#property indicator_label2 "DownSignal"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 4
//--- параметры для чтения данных
input string InpFileName="MACD.csv"; // имя файла
input string InpDirectoryName="Data"; // имя директории
//--- глобальные переменные
int ind=0; // индекс
double upbuff[]; // индикаторный буфер стрелок вверх
double downbuff[]; // индикаторный буфер стрелок вниз
bool sign_buff[]; // массив сигналов (true - покупка, false - продажа)
datetime time_buff[]; // массив времени наступления сигналов
int size=0; // размер массивов сигналов
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- откроем файл
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_CSV);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для чтения",InpFileName);
//--- сначала прочитаем количество сигналов
size=(int)FileReadNumber(file_handle);
//--- выделим память для массивов
ArrayResize(sign_buff,size);
ArrayResize(time_buff,size);
//--- прочитаем данные из файла
for(int i=0;i<size;i++)
{
//--- время сигнала
time_buff[i]=FileReadDatetime(file_handle);
//--- значение сигнала
sign_buff[i]=FileReadBool(file_handle);
}
//--- закрываем файл
FileClose(file_handle);
}
else
{
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
return(INIT_FAILED);
}
//--- привязка массивов
SetIndexBuffer(0,upbuff,INDICATOR_DATA);
SetIndexBuffer(1,downbuff,INDICATOR_DATA);
//--- зададим код символа для отрисовки в PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,241);
PlotIndexSetInteger(1,PLOT_ARROW,242);
//---- установка значений индикатора, которые не будут видимы на графике
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
//---
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,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
//--- цикл для еще необработанных баров
for(int i=prev_calculated;i<rates_total;i++)
{
//--- по умолчанию 0
upbuff[i]=0;
downbuff[i]=0;
//--- проверка, есть ли еще данные
if(ind<size)
{
for(int j=ind;j<size;j++)
{
//--- если даты совпадают, то используем значение из файла
if(time[i]==time_buff[j])
{
//--- рисуем стрелку в зависимости от сигнала
if(sign_buff[j])
upbuff[i]=high[i];
else
downbuff[i]=low[i];
//--- увеличим счетчик
ind=j+1;
break;
}
}
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}

Смотри также

Тип bool, FileWrite()


FileReadDatetime

Справочник MQL4 / Файловые операции / FileReadDatetime

FileReadDatetime

Читает из файла типа CSV строку одного из форматов: "YYYY.MM.DD HH:MI:SS", "YYYY.MM.DD" или "HH:MI:SS" - и преобразует её в значение типа datetime.

datetime FileReadDatetime(
int file_handle // handle файла
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

Возвращаемое значение

Значение типа datetime.

Пример (используется файл, полученный в результате работы примера для функции FileWrite())

//+------------------------------------------------------------------+
//| Demo_FileReadDateTime.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
//---- plot Label1
#property indicator_label1 "UpSignal"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 4
//---- plot Label2
#property indicator_label2 "DownSignal"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 4
//--- параметры для чтения данных
input string InpFileName="MACD.csv"; // имя файла
input string InpDirectoryName="Data"; // имя директории
//--- глобальные переменные
int ind=0; // индекс
double upbuff[]; // индикаторный буфер стрелок вверх
double downbuff[]; // индикаторный буфер стрелок вниз
bool sign_buff[]; // массив сигналов (true - покупка, false - продажа)
datetime time_buff[]; // массив времени наступления сигналов
int size=0; // размер массивов сигналов
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- откроем файл
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_CSV);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для чтения",InpFileName);
//--- сначала прочитаем количество сигналов
size=(int)FileReadNumber(file_handle);
//--- выделим память для массивов
ArrayResize(sign_buff,size);
ArrayResize(time_buff,size);
//--- прочитаем данные из файла
for(int i=0;i<size;i++)
{
//--- время сигнала
time_buff[i]=FileReadDatetime(file_handle);
//--- значение сигнала
sign_buff[i]=FileReadBool(file_handle);
}
//--- закрываем файл
FileClose(file_handle);
}
else
{
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
return(INIT_FAILED);
}
//--- привязка массивов
SetIndexBuffer(0,upbuff,INDICATOR_DATA);
SetIndexBuffer(1,downbuff,INDICATOR_DATA);
//--- зададим код символа для отрисовки в PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,241);
PlotIndexSetInteger(1,PLOT_ARROW,242);
//---- установка значений индикатора, которые не будут видимы на графике
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
//---
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,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
//--- цикл для еще необработанных баров
for(int i=prev_calculated;i<rates_total;i++)
{
//--- по умолчанию 0
upbuff[i]=0;
downbuff[i]=0;
//--- проверка, есть ли еще данные
if(ind<size)
{
for(int j=ind;j<size;j++)
{
//--- если даты совпадают, то используем значение из файла
if(time[i]==time_buff[j])
{
//--- рисуем стрелку в зависимости от сигнала
if(sign_buff[j])
upbuff[i]=high[i];
else
downbuff[i]=low[i];
//--- увеличим счетчик
ind=j+1;
break;
}
}
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}

Смотри также

Тип datetime, StringToTime(), TimeToString(), FileWrite()


FileReadDouble

Справочник MQL4 / Файловые операции / FileReadDouble

FileReadDouble

Читает число двойной точности с плавающей точкой (double) из бинарного файла с текущего положения файлового указателя.

double FileReadDouble(
int file_handle, // handle файла
int size=DOUBLE_VALUE // кол-во байт
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

size=DOUBLE_VALUE

[in] Количество байт (до 8 включительно), которые нужно прочитать. Предусмотрены константы: DOUBLE_VALUE=8, FLOAT_VALUE=4, таким образом, функция может прочитать значение типа double или float.

Возвращаемое значение

Значение типа double.

Примечание

Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример (используется файл, полученный в результате работы примера для функции FileWriteDouble())

//+------------------------------------------------------------------+
//| Demo_FileReadDouble.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
//---- plot Label1
#property indicator_label1 "MA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#property indicator_separate_window
//--- параметры для чтения данных
input string InpFileName="MA.bin"; // Имя файла
input string InpDirectoryName="Data"; // Имя каталога
//--- глобальные переменные
int ind=0;
int size=0;
double ma_buff[];
datetime time_buff[];
//--- indicator buffer
double buff[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- откроем файл
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для чтения",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- сначала прочитаем сколько всего в файле данных
size=(int)FileReadDouble(file_handle,DOUBLE_VALUE);
//--- выделим память для массивов
ArrayResize(ma_buff,size);
ArrayResize(time_buff,size);
//--- прочитаем данные из файла
for(int i=0;i<size;i++)
{
time_buff[i]=(datetime)FileReadDouble(file_handle,DOUBLE_VALUE);
ma_buff[i]=FileReadDouble(file_handle,DOUBLE_VALUE);
}
//--- закроем файл
FileClose(file_handle);
PrintFormat("Данные прочитаны, файл %s закрыт",InpFileName);
}
else
{
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
return(INIT_FAILED);
}
//--- привязка массива к индикаторному буферу с индексом 0
SetIndexBuffer(0,buff,INDICATOR_DATA);
//--- установка значений индикатора, которые не будут видимы на графике
SetIndexEmptyValue(0,0.0);
//--- установка направления индексации как в таймсериях
ArraySetAsSeries(time_buff,true);
ArraySetAsSeries(ma_buff,true);
//---
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);
//--- цикл для еще необработанных баров
for(int i=prev_calculated;i<rates_total;i++)
{
//--- по умолчанию 0
buff[i]=0;
for(int j=0;j<size;j++)
{
//--- если даты совпадают, то используем значение из файла
if(time[i]==time_buff[j])
{
buff[i]=ma_buff[j];
}
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}

Смотри также

Вещественные типы (double, float), StringToDouble(), DoubleToString(), FileWriteDouble()


FileReadFloat

Справочник MQL4 / Файловые операции / FileReadFloat

FileReadFloat

Читает число одинарной точности с плавающей точкой (float) из текущей позиции бинарного файла.

float FileReadFloat(
int file_handle // handle файла
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функциейFileOpen().

Возвращаемое значение

Значение типа float.

Примечание

Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример (используется файл, полученный в результате работы примера для функции FileWriteFloat())

//+------------------------------------------------------------------+
//| Demo_FileReadFloat.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//--- параметры для чтения данных
input string InpFileName="Close.bin"; // имя файла
input string InpDirectoryName="Data"; // имя директории
//--- глобальные переменные
int size=0;
double close_buff[];
datetime time_buff[];
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- откроем файл
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для чтения",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- прочитаем данные из файла
while(!FileIsEnding(file_handle))
{
size++;
//--- проверка размера массивов
if(size>ArraySize(time_buff)) ArrayResize(time_buff,size,100);
if(size>ArraySize(close_buff)) ArrayResize(close_buff,size,100);
//--- считываем значение времени и цены
time_buff[size-1]=(datetime)FileReadDouble(file_handle);
close_buff[size-1]=(double)FileReadFloat(file_handle);
}
//--- закроем файл
FileClose(file_handle);
PrintFormat("Данные прочитаны, файл %s закрыт",InpFileName);
//--- проверка размеров массивов
if(ArraySize(time_buff)==ArraySize(close_buff))
{
//--- вывод прочитанных данных
PrintFormat("Read data:%d",ArraySize(time_buff));
for(int i=0; i<ArraySize(time_buff); i++) PrintFormat("%d, time=%s, close price=%s",i,TimeToString(time_buff[i]),DoubleToString(close_buff[i],_Digits));
}
else
Print("Ошибка в данных.");
}
else
{
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
return;
}
}

Смотри также

Вещественные типы (double, float), FileReadDouble(), FileWriteFloat()


FileReadInteger

Справочник MQL4 / Файловые операции / FileReadInteger

FileReadInteger

Читает из бинарного файла значение типа int, short или char в зависимости от указанной длины в байтах. Чтение производится с текущего положения файлового указателя.

int FileReadInteger(
int file_handle, // handle файла
int size=INT_VALUE // кол-во байт
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

size=INT_VALUE

[in] Количество байт (до 4 включительно), которые нужно прочитать. Предусмотрены соответствующие константы: CHAR_VALUE=1, SHORT_VALUE=2 и INT_VALUE (LONG_VALUE)=4, таким образом функция может прочитать целое значение типа char, short, int, uint и long.

Возвращаемое значение

Значение типа int. Результат этой функции необходимо явно приводить к целевому типу, то есть тому типу данных, который требуется прочитать. Так как возвращается значение типа int, то его можно спокойно преобразовать в любое целое значение. Файловый указатель перемещается на количество считываемых байт.

Примечание

При чтении менее 4-х байт, полученный результат всегда будет положительным. Если читается один или два байта, то знак числа можно точно определить путем явного приведения соответственно к типу char (1 байт) или типу short (2 байта). Получение знака для трехбайтового числа является нетривиальным, так как нет соответствующего базового типа.

Пример (используется файл, полученный в результате работы примера для функции FileWriteInteger())

//+------------------------------------------------------------------+
//| Demo_FileReadInteger.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
//---- plot Label1
#property indicator_label1 "Trends"
#property indicator_type1 DRAW_SECTION
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- параметры для чтения данных
input string InpFileName="Trend.bin"; // Имя файла
input string InpDirectoryName="Data"; // Имя каталога
//--- глобальные переменные
int ind=0;
int size=0;
datetime time_buff[];
//--- indicator buffers
double buff[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
int def_size=100;
//--- выделим память для массива
ArrayResize(time_buff,def_size);
//--- откроем файл
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для чтения",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- вспомогательные переменные
int arr_size;
uchar arr[];
//--- прочитаем данные из файла
while(!FileIsEnding(file_handle))
{
//--- узнаем сколько символов использовано для записи времени
arr_size=FileReadInteger(file_handle,INT_VALUE);
ArrayResize(arr,arr_size);
for(int i=0;i<arr_size;i++)
arr[i]=(char)FileReadInteger(file_handle,CHAR_VALUE);
//--- запомним значение времени
time_buff[size]=StringToTime(CharArrayToString(arr));
size++;
//--- увеличим размеры массивов если они переполнены
if(size==def_size)
{
def_size+=100;
ArrayResize(time_buff,def_size);
}
}
//--- закроем файл
FileClose(file_handle);
PrintFormat("Данные прочитаны, файл %s закрыт",InpFileName);
}
else
{
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
return(INIT_FAILED);
}
//--- привязка массива к индикаторному буферу с индексом 0
SetIndexBuffer(0,buff,INDICATOR_DATA);
//--- установка значений индикатора, которые не будут видимы на графике
SetIndexEmptyValue(0,0.0);
//--- установка индексации как в таймсерии
ArraySetAsSeries(time_buff,true);
//---
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(close,true);
//--- цикл для еще необработанных баров
for(int i=prev_calculated;i<rates_total;i++)
{
//--- по умолчанию 0
buff[i]=0;
for(int j=0;j<size;j++)
{
//--- если даты совпадают, то используем цену close
if(time[i]==time_buff[j])
{
//--- получим цену
buff[i]=close[i];
}
}
}
//---
return(rates_total);
}

Смотри также

IntegerToString(), StringToInteger(), Целые типы, FileWriteInteger()


FileReadLong

Справочник MQL4 / Файловые операции / FileReadLong

FileReadLong

Читает целое число типа long (8 байт) из текущей позиции бинарного файла.

long FileReadLong(
int file_handle // handle файла
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

Возвращаемое значение

Значение типа long.

Пример (используется файл, полученный в результате работы примера для функции FileWriteLong())

//+------------------------------------------------------------------+
//| Demo_FileReadLong.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_buffers 1
//---- plot Label1
#property indicator_label1 "Volume"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrYellow
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
#property indicator_separate_window
//--- параметры для чтения данных
input string InpFileName="Volume.bin"; // имя файла
input string InpDirectoryName="Data"; // имя директории
//--- глобальные переменные
int ind=0;
int size=0;
long volume_buff[];
datetime time_buff[];
//--- indicator buffers
double buff[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- откроем файл
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для записи",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- сначала прочитаем сколько всего в файле данных
size=(int)FileReadLong(file_handle);
//--- выделим память для массивов
ArrayResize(volume_buff,size);
ArrayResize(time_buff,size);
//--- прочитаем данные из файла
for(int i=0;i<size;i++)
{
time_buff[i]=(datetime)FileReadLong(file_handle);
volume_buff[i]=FileReadLong(file_handle);
}
//--- закроем файл
FileClose(file_handle);
PrintFormat("Данные прочитаны, файл %s закрыт",InpFileName);
}
else
{
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
return(INIT_FAILED);
}
//--- привязка массива к индикаторному буферу с индексом 0
SetIndexBuffer(0,buff,INDICATOR_DATA);
//---- установка значений индикатора, которые не будут видимы на графике
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
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,false);
//--- цикл для еще необработанных баров
for(int i=prev_calculated;i<rates_total;i++)
{
//--- по умолчанию 0
buff[i]=0;
//--- проверка, есть ли еще данные
if(ind<size)
{
for(int j=ind;j<size;j++)
{
//--- если даты совпадают, то используем значение из файла
if(time[i]==time_buff[j])
{
buff[i]=(double)volume_buff[j];
ind=j+1;
break;
}
}
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}

Смотри также

Целые типы, FileReadInteger(), FileWriteLong()


FileReadNumber

Справочник MQL4 / Файловые операции / FileReadNumber

FileReadNumber

Читает из файла типа CSV строку от текущего положения до разделителя (либо до конца текстовой строки) и преобразует прочитанную строку в значение типа double.

double FileReadNumber(
int file_handle // handle файла
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

Возвращаемое значение

Значение типа double.

Пример использования в FileIsLineEnding().

Смотри также

FileWriteString()


FileReadString

Справочник MQL4 / Файловые операции / FileReadString

FileReadString

Читает из файла строку с текущего положения файлового указателя.

string FileReadString(
int file_handle, // handle файла
int length=0 // длина строки
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

length=0

[in] Количество символов для чтения.

Возвращаемое значение

Прочитанная строка(string).

Примечание

При чтении из bin-файла обязательно указывать длину читаемой строки. При чтении из txt-файла длину строки указывать не надо, будет прочитана строка от текущего положения до признака перевода строки "\r\n". При чтении из csv-файла длину строки также указывать не надо, будет прочитана строка от текущего положения до ближайшего разделителя либо до признака конца текстовой строки.

Если файл открыт с флагом FILE_ANSI, то прочитанная строка преобразовывается в Unicode.

Пример (используется файл, полученный в результате работы примера для функции FileWriteInteger())

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- параметры для чтения данных
input string InpFileName="Trend.bin"; // имя файла
input string InpDirectoryName="Data"; // имя директории
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- откроем файл
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN|FILE_ANSI);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для чтения",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- вспомогательные переменные
int str_size;
string str;
//--- прочитаем данные из файла
while(!FileIsEnding(file_handle))
{
//--- узнаем сколько символов использовано для записи времени
str_size=FileReadInteger(file_handle,INT_VALUE);
//--- прочитаем строку
str=FileReadString(file_handle,str_size);
//--- распечатаем строку
PrintFormat(str);
}
//--- закроем файл
FileClose(file_handle);
PrintFormat("Данные прочитаны, файл %s закрыт",InpFileName);
}
else
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}

Смотри также

Тип string, Преобразование данных, FileWriteInteger()


FileReadStruct

Справочник MQL4 / Файловые операции / FileReadStruct

FileReadStruct

Cчитывает из бинарного файла содержимое в структуру, переданную в качестве параметра. Чтение производится с текущего положения файлового указателя.

uint FileReadStruct(
int file_handle, // handle файла
const void& struct_object, // структура, куда происходит считывание
int size=-1 // размер структуры в байтах
);

Параметры

file_handle

[in] Файловый описатель открытого бинарного файла.

struct_object

[out] Объект указанной структуры. Структура не должна содержать строки, динамические массивы и виртуальные функции.

size=-1

[in] Количество байт, которые нужно прочитать. Если размер не указан или указано большее количество байт, чем размер структуры, то используется точный размер указанной структуры.

Возвращаемое значение

В случае удачи функция возвращает количество прочитанных байт 0 в случае ошибки. При успешном завершении количество прочитанных байт равно размеру структуры. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Файловый указатель перемещается на это же количество байт.

Пример (используется файл, полученный в результате работы примера для функции FileWriteStruct())

//+------------------------------------------------------------------+
//| Demo_FileReadStruct.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 4
//---- plot Label1
#property indicator_label1 "Open"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#property indicator_label1 "High"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrGreen
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
#property indicator_label1 "Low"
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrOrange
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
#property indicator_label1 "Close"
#property indicator_type4 DRAW_LINE
#property indicator_color4 clrRed
#property indicator_style4 STYLE_SOLID
#property indicator_width4 1
#property indicator_separate_window
//--- параметры для получения данных
input string InpFileName="EURUSD.txt"; // имя файла
input string InpDirectoryName="Data"; // имя директории
//+------------------------------------------------------------------+
//| Структура для хранения данных свечи |
//+------------------------------------------------------------------+
struct candlesticks
{
double open; // цена открытия
double close; // цена закрытия
double high; // максимальная цена
double low; // минимальная цена
datetime date; // дата
};
//--- индикаторные буферы
double open_buff[];
double close_buff[];
double high_buff[];
double low_buff[];
//--- глобальные переменные
candlesticks cand_buff[];
int size=0;
int ind=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
int default_size=100;
ArrayResize(cand_buff,default_size);
//--- откроем файл
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN|FILE_COMMON);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для чтения",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
//--- прочитаем данные из файла
while(!FileIsEnding(file_handle))
{
//--- запишем данные в файл
uint bytesread=FileReadStruct(file_handle,cand_buff[size]);
//--- проверка количества записанных данных
if (bytesread!=sizeof(candlesticks))
{
PrintFormat("Ошибка чтения данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return(INIT_FAILED);
}
else
{
size++;
//--- проверим массив на переполненность
if(size==default_size)
{
//--- увеличим размерность массива
default_size+=100;
ArrayResize(cand_buff,default_size);
}
}
}
//--- закроем файл
FileClose(file_handle);
PrintFormat("Данные прочитаны, файл %s закрыт",InpFileName);
}
else
{
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
return(INIT_FAILED);
}
//--- indicator buffers mapping
SetIndexBuffer(0,open_buff,INDICATOR_DATA);
SetIndexBuffer(1,high_buff,INDICATOR_DATA);
SetIndexBuffer(2,low_buff,INDICATOR_DATA);
SetIndexBuffer(3,close_buff,INDICATOR_DATA);
//--- пустое значение
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
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,false);
//--- цикл для еще необработанных свечек
for(int i=prev_calculated;i<rates_total;i++)
{
//--- по умолчанию 0
open_buff[i]=0;
close_buff[i]=0;
high_buff[i]=0;
low_buff[i]=0;
//--- проверка, есть ли еще данные
if(ind<size)
{
for(int j=ind;j<size;j++)
{
//--- если даты совпадают, то используем значение из файла
if(time[i]==cand_buff[j].date)
{
open_buff[i]=cand_buff[j].open;
close_buff[i]=cand_buff[j].close;
high_buff[i]=cand_buff[j].high;
low_buff[i]=cand_buff[j].low;
//--- увеличиваем счетчик
ind=j+1;
break;
}
}
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}

Смотри также

Структуры и классы, FileWriteStruct()


FileSeek

Справочник MQL4 / Файловые операции / FileSeek

FileSeek

Перемещает положение файлового указателя на указанное количество байт относительно указанного положения.

bool FileSeek(
int file_handle, // handle файла
long offset, // в байтах
ENUM_FILE_POSITION origin // позиция для отсчета
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

offset

[in] Смещение в байтах (может принимать и отрицательное значение).

origin

[in] Точка отсчета для смещения. Может принимать одно из значений перечисления ENUM_FILE_POSITION.

Возвращаемое значение

В случае удачи функция возвращает true, в случае ошибки - false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Если результатом выполнения функции FileSeek() является отрицательное смещение (выход за "левую границу" файла), то файловый указатель будет установлен на начало файла.

Если выставить позицию за "правую границу" файла (больше, чем размер файла), то последующая запись в файл будет будет произведена не с конца файла, а с выставленной позиции. При этом между предыдущим концом файла и выставленной позицией будут записаны неопределенные значения.

Пример:

//+------------------------------------------------------------------+
//| Demo_FileSeek.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input string InpFileName="file.txt"; // имя файла
input string InpDirectoryName="Data"; // имя директории
input int InpEncodingType=FILE_ANSI; // ANSI=32 или UNICODE=64
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- установим значение переменной для генерации случайных чисел
_RandomSeed=GetTickCount();
//--- переменные для позиций начала строк
ulong pos[];
int size;
//--- сбросим значение ошибки
ResetLastError();
//--- откроем файл
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для чтения",InpFileName);
//--- получим позицию начала для каждой строки в файле
GetStringPositions(file_handle,pos);
//--- определим сколько всего строк в файле
size=ArraySize(pos);
if(!size)
{
//--- если в файле нет строк, то завершаем работу
PrintFormat("Файл %s пуст!",InpFileName);
FileClose(file_handle);
return;
}
//--- выберем случайно номер строки
int ind=MathRand()%size;
//--- сдвинем позицию на начало этой строки
if(FileSeek(file_handle,pos[ind],SEEK_SET)==true)
{
//--- прочитаем и распечатаем строку с номером ind
PrintFormat("Текст строки с номером %d: \"%s\"",ind,FileReadString(file_handle));
}
//--- закроем файл
FileClose(file_handle);
PrintFormat("Файл %s закрыт",InpFileName);
}
else
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}
//+------------------------------------------------------------------+
//| Функция определяет позиции начала для каждой из строк в файле и |
//| помещает их в массив arr |
//+------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
{
//--- размер массива по умолчанию
int def_size=127;
//--- выделим память для массива
ArrayResize(arr,def_size);
//--- счетчик строк
int i=0;
//--- если не конец файла, то есть хотя бы одна строка
if(!FileIsEnding(handle))
{
arr[i]=FileTell(handle);
i++;
}
else
return; // файл пуст, выходим
//--- определим сдвиг в байтах в зависимости от кодировки
int shift;
if(FileGetInteger(handle,FILE_IS_ANSI))
shift=1;
else
shift=2;
//--- в цикле перебираем строки
while(1)
{
//--- читаем строку
FileReadString(handle);
//--- проверка на конец файла
if(!FileIsEnding(handle))
{
//--- запомним позицию следующей строки
arr[i]=FileTell(handle)+shift;
i++;
//--- увеличим размер массива, если он переполнен
if(i==def_size)
{
def_size+=def_size+1;
ArrayResize(arr,def_size);
}
}
else
break; // конец файла, выходим
}
//--- установим истинный размер массива
ArrayResize(arr,i);
}


FileSize

Справочник MQL4 / Файловые операции / FileSize

FileSize

Возвращает размер файла в байтах.

ulong FileSize(
int file_handle // handle файла
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

Возвращаемое значение

Значение типа int.

Примечание

Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input ulong InpThresholdSize=20; // граница размера файлов в килобайтах
input string InpBigFolderName="big"; // папка для больших файлов
input string InpSmallFolderName="small"; // папка для маленьких файлов
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string file_name; // переменная для хранения имен файлов
string filter="*.csv"; // фильтр для поиска файлов
ulong file_size=0; // размер файла в байтах
int size=0; // количество файлов
//--- распечатаем путь к папке в которой будем работать
PrintFormat("Работаем в папке %s\\Files\\",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
//--- получение хэндла поиска в корне общей папки всех терминалов
long search_handle=FileFindFirst(filter,file_name,FILE_COMMON);
//--- проверим, успешно ли отработала функция FileFindFirst()
if(search_handle!=INVALID_HANDLE)
{
//--- в цикле перемещаем файлы в зависимости от их размера
do
{
//--- откроем файл
ResetLastError();
int file_handle=FileOpen(file_name,FILE_READ|FILE_CSV|FILE_COMMON);
if(file_handle!=INVALID_HANDLE)
{
//--- получим размер файла
file_size=FileSize(file_handle);
//--- закроем файл
FileClose(file_handle);
}
else
{
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",file_name,GetLastError());
continue;
}
//--- распечатаем размер файла
PrintFormat("Размер файла %s равен %d байт",file_name,file_size);
//--- определим путь для перемещения файла
string path;
if(file_size>InpThresholdSize*1024)
path=InpBigFolderName+"//"+file_name;
else
path=InpSmallFolderName+"//"+file_name;
//--- переместим файл
ResetLastError();
if(FileMove(file_name,FILE_COMMON,path,FILE_REWRITE|FILE_COMMON))
PrintFormat("Файл %s перемещен",file_name);
else
PrintFormat("Ошибка, код = %d",GetLastError());
}
while(FileFindNext(search_handle,file_name));
//--- закрываем хэндл поиска
FileFindClose(search_handle);
}
else
Print("Files not found!");
}


FileTell

Справочник MQL4 / Файловые операции / FileTell

FileTell

Возвращает текущее положение файлового указателя соответствующего открытого файла.

ulong FileTell(
int file_handle // handle файла
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

Возвращаемое значение

Текущая позиция файлового описателя в байтах от начала файла.

Примечание

Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

//+------------------------------------------------------------------+
//| Demo_FileTell.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input string InpFileName="file.txt"; // имя файла
input string InpDirectoryName="Data"; // имя директории
input int InpEncodingType=FILE_ANSI; // ANSI=32 или UNICODE=64
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- установим значение переменной для генерации случайных чисел
_RandomSeed=GetTickCount();
//--- переменные для позиций начала строк
ulong pos[];
int size;
//--- сбросим значение ошибки
ResetLastError();
//--- откроем файл
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для чтения",InpFileName);
//--- получим позицию начала для каждой строки в файле
GetStringPositions(file_handle,pos);
//--- определим сколько всего строк в файле
size=ArraySize(pos);
if(!size)
{
//--- если в файле нет строк, то завершаем работу
PrintFormat("Файл %s пуст!",InpFileName);
FileClose(file_handle);
return;
}
//--- выберем случайно номер строки
int ind=MathRand()%size;
//--- сдвинем позицию на начало этой строки
FileSeek(file_handle,pos[ind],SEEK_SET);
//--- прочитаем и распечатаем строку с номером ind
PrintFormat("Текст строки с номером %d: \"%s\"",ind,FileReadString(file_handle));
//--- закроем файл
FileClose(file_handle);
PrintFormat("Файл %s закрыт",InpFileName);
}
else
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}
//+------------------------------------------------------------------+
//| Функция определяет позиции начала для каждой из строк в файле и |
//| помещает их в массив arr |
//+------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
{
//--- размер массива по умолчанию
int def_size=127;
//--- выделим память для массива
ArrayResize(arr,def_size);
//--- счетчик строк
int i=0;
//--- если не конец файла, то есть хотя бы одна строка
if(!FileIsEnding(handle))
{
arr[i]=FileTell(handle);
i++;
}
else
return; // файл пуст, выходим
//--- определим сдвиг в байтах в зависимости от кодировки
int shift;
if(FileGetInteger(handle,FILE_IS_ANSI))
shift=1;
else
shift=2;
//--- в цикле перебираем строки
while(1)
{
//--- читаем строку
FileReadString(handle);
//--- проверка на конец файла
if(!FileIsEnding(handle))
{
//--- запомним позицию следующей строки
arr[i]=FileTell(handle)+shift;
i++;
//--- увеличим размер массива, если он переполнен
if(i==def_size)
{
def_size+=def_size+1;
ArrayResize(arr,def_size);
}
}
else
break; // конец файла, выходим
}
//--- установим истинный размер массива
ArrayResize(arr,i);
}


FileWrite

Справочник MQL4 / Файловые операции / FileWrite

FileWrite

Запись данных в файл типа CSV или TXT, разделитель между данными вставляется автоматически, если он не равен 0. После записи в файл добавляется признак конца строки "\r\n".

uint FileWrite(
int file_handle, // handle файла
... // список записываемых параметров
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

...

[in] Список параметров, разделенных запятыми, для записи в файл. Количество выводимых в файл параметров не должно превышать 63.

Возвращаемое значение

Количество записанных байт или 0 в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

При выводе числовые данные преобразуются в текстовый формат (см. функцию Print()). Данные типа double выводятся с точностью до 16 десятичных цифр после точки, при этом данные могут выводиться либо в традиционном либо в научном формате – в зависимости от того, как запись будет наиболее компактна. Данные типа float выводятся с 5 десятичными цифрами после точки. Для вывода вещественных чисел с другой точностью либо в явно указанном формате необходимо использовать функцию DoubleToString().

Числа типа bool выводятся в виде строк "true" или "false". Числа типа datetime выводятся в формате "YYYY.MM.DD HH:MI:SS".

Пример:

//+------------------------------------------------------------------+
//| Demo_FileWrite.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- параметры для получения данных из терминала
input string InpSymbolName="EURUSD"; // Валютная пара
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // Таймфрейм
input int InpFastEMAPeriod=12; // Период быстрой средней
input int InpSlowEMAPeriod=26; // Период медленной средней
input int InpSignalPeriod=9; // Период усреднения разности
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Тип цены
//--- параметры для записи данных в файл
input string InpFileName="MACD.csv"; // Имя файла
input string InpDirectoryName="Data"; // Имя каталога
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
bool sign_buff[]; // массив сигналов (true - покупка, false - продажа)
datetime time_buff[]; // массив времени наступления сигналов
int sign_size=0; // размер массивов сигналов
double macd_buff[]; // массив значений индикатора
datetime date_buff[]; // массив дат индикатора
int macd_size=0; // размер массивов индикатора
//--- установим для массивов признак таймсерии
ArraySetAsSeries(sign_buff,true);
ArraySetAsSeries(time_buff,true);
ArraySetAsSeries(macd_buff,true);
ArraySetAsSeries(date_buff,true);
//--- сбросим код ошибки
ResetLastError();
//--- скопируем таймсерию,содержащую время открытия последних 1000 баров
int copied=CopyTime(NULL,0,0,1000,date_buff);
if(copied<=0)
{
PrintFormat("Не удалось скопировать времена открытия за последние 1000 баров. Код ошибки=%d",GetLastError());
return;
}
//--- подготовим массив macd_buff
ArrayResize(macd_buff,copied);
//--- скопируем значения основной линии индикатора iMACD
for(int i=0;i<copied;i++)
{
macd_buff[i]=iMACD(InpSymbolName,InpSymbolPeriod,InpFastEMAPeriod,InpSlowEMAPeriod,InpSignalPeriod,InpAppliedPrice,MODE_MAIN,i);
}
//--- получим размер буфера
macd_size=ArraySize(macd_buff);
//--- проанализируем данные и сохраним сигналы индикатора в массивы
ArrayResize(sign_buff,macd_size-1);
ArrayResize(time_buff,macd_size-1);
for(int i=1;i<macd_size;i++)
{
//--- сигнал на покупку
if(macd_buff[i-1]<0 && macd_buff[i]>=0)
{
sign_buff[sign_size]=true;
time_buff[sign_size]=date_buff[i];
sign_size++;
}
//--- сигнал на продажу
if(macd_buff[i-1]>0 && macd_buff[i]<=0)
{
sign_buff[sign_size]=false;
time_buff[sign_size]=date_buff[i];
sign_size++;
}
}
//--- откроем файл для записи значений индикатора (если его нет, то создастся автоматически)
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для записи",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- сначала запишем количество сигналов
FileWrite(file_handle,sign_size);
//--- запишем время сигналов и их значения в файл
for(int i=0;i<sign_size;i++)
FileWrite(file_handle,time_buff[i],sign_buff[i]);
//--- закрываем файл
FileClose(file_handle);
PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
}
else
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}

Смотри также

Comment(), Print(), StringFormat()


FileWriteArray

Справочник MQL4 / Файловые операции / FileWriteArray

FileWriteArray

Записывает в файл типа BIN массивы любых типов, кроме строковых (может быть массив структур, не содержащих строки и динамические массивы).

uint FileWriteArray(
int file_handle, // handle файла
const void& array[], // массив
int start=0, // начальный индекс в массиве
int count=WHOLE_ARRAY // количество элементов
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

array[]

[out] Массив для записи.

start=0

[in] Начальный индекс в массиве (номер первого записываемого элемента).

count=WHOLE_ARRAY

[in] Количество записываемых элементов (WHOLE_ARRAY означает, что записываются все элементы начиная с номера start до конца массива).

Возвращаемое значение

Количество записанных элементов или 0 в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Строковый массив может записываться только в файл типа TXT. В этом случае строки автоматически завершаются символами конца строки "\r\n". В зависимости от типа файла ANSI или UNICODE, строки преобразовываются к ansi-кодировке, или нет.

Пример:

//+------------------------------------------------------------------+
//| Demo_FileWriteArray.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- входные параметры
input string InpFileName="data.bin";
input string InpDirectoryName="SomeFolder";
//+------------------------------------------------------------------+
//| Структура для хранения данных о ценах |
//+------------------------------------------------------------------+
struct prices
{
datetime date; // дата
double bid; // цена бид
double ask; // цена аск
};
//--- глобальные переменные
int count=0;
int size=20;
string path=InpDirectoryName+"//"+InpFileName;
prices arr[];
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- выделение памяти для массива
ArrayResize(arr,size);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- запись оставшихся count строк, если count<n
WriteData(count);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- сохраним данные в массив
arr[count].date=TimeCurrent();
arr[count].bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
arr[count].ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- отобразим текущие данные
Print("Date = ",arr[count].date," Bid = ",arr[count].bid," Ask = ",arr[count].ask);
//--- увеличим счетчик
count++;
//--- если массив заполнился, то записываем данные в файл и обнуляем его
if(count==size)
{
WriteData(size);
count=0;
}
}
//+------------------------------------------------------------------+
//| Запись n элементов массива в файл |
//+------------------------------------------------------------------+
void WriteData(const int n)
{
//--- откроем файл
ResetLastError();
int handle=FileOpen(path,FILE_READ|FILE_WRITE|FILE_BIN);
if(handle!=INVALID_HANDLE)
{
//--- запишем данные массива в конец файла
FileSeek(handle,0,SEEK_END);
FileWriteArray(handle,arr,0,n);
//--- закрываем файл
FileClose(handle);
}
else
Print("Failed to open the file, error ",GetLastError());
}

Смотри также

Переменные, FileSeek()


FileWriteDouble

Справочник MQL4 / Файловые операции / FileWriteDouble

FileWriteDouble

Записывает в файл значение параметра типа double с текущего положения файлового указателя.

uint FileWriteDouble(
int file_handle, // handle файла
double value, // значение для записи
int size=DOUBLE_VALUE // кол-во байт
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

value

[in] Значение типа double.

size=DOUBLE_VALUE

[in] Количество байт (до 8 включительно), которые нужно записать. Предусмотрены константы: DOUBLE_VALUE=8, FLOAT_VALUE=4, таким образом, функция может записать значение типа double или float.

Возвращаемое значение

В случае удачи функция возвращает количество записанных байт или 0 в случае ошибки. При успешном завершении количество записанных байт равно размеру типа данных (sizeof(double)=8). Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Файловый указатель перемещается на это же количество байт.

Пример:

//+------------------------------------------------------------------+
//| Demo_FileWriteDouble.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- параметры для получения данных из терминала
input string InpSymbolName="EURUSD"; // Валютная пара
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // Таймфрейм
input int InpMAPeriod=10; // Период сглаживания
input int InpMAShift=0; // Смещение индикатора
input ENUM_MA_METHOD InpMAMethod=MODE_SMA; // Тип сглаживания
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Тип цены
//--- параметры для записи данных в файл
input string InpFileName="MA.bin"; // Имя файла
input string InpDirectoryName="Data"; // Имя каталога
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date_finish=TimeCurrent();
double ma_buff[];
datetime time_buff[];
int size;
//--- установим для массивов признак таймсерии
ArraySetAsSeries(ma_buff,true);
ArraySetAsSeries(time_buff,true);
//--- сбросим код ошибки
ResetLastError();
//--- скопируем таймсерию,содержащую время открытия последних 1000 баров
int copied=CopyTime(NULL,0,0,1000,time_buff);
if(copied<=0)
{
Print("Не удалось скопировать времена открытия за последние 1000 баров");
return;
}
//--- подготовим массив ma_buff
ArrayResize(ma_buff,copied);
//--- скопируем значения индикатора iMA
for(int i=0;i<copied;i++)
{
ma_buff[i]=iMA(InpSymbolName,InpSymbolPeriod,InpMAPeriod,InpMAShift,InpMAMethod,InpAppliedPrice,i);
}
//---
PrintFormat("В файл будут записаны значения индикатора, начиная с %s по %s",TimeToString(time_buff[copied-1]),TimeToString(time_buff[0]));
//--- получим размер буфера
size=ArraySize(ma_buff);
//--- откроем файл для записи значений индикатора (если его нет, то создастся автоматически)
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для записи",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- сначала запишем размер выборки данных
uint byteswritten=FileWriteDouble(file_handle,(double)size,DOUBLE_VALUE);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(double))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
//--- запишем время и значения индикатора в файл
for(int i=0;i<size;i++)
{
byteswritten=FileWriteDouble(file_handle,(double)time_buff[i],DOUBLE_VALUE);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(double))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
byteswritten=FileWriteDouble(file_handle,ma_buff[i],DOUBLE_VALUE);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(double))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
}
//--- закрываем файл
FileClose(file_handle);
PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
}
else
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}

Смотри также

Вещественные типы (double, float)


FileWriteFloat

Справочник MQL4 / Файловые операции / FileWriteFloat

FileWriteFloat

Записывает в bin-файл значение параметра типа float с текущего положения файлового указателя.

uint FileWriteFloat(
int file_handle, // handle файла
float value // записываемое значение
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

value

[in] Значение типа float.

Возвращаемое значение

В случае удачи функция возвращает количество записанных байт или 0 в случае ошибки. При успешном завершении количество записанных байт равно размеру типа данных (sizeof(float)=4). Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Файловый указатель перемещается на это же количество байт.

Пример:

//+------------------------------------------------------------------+
//| Demo_FileWriteFloat.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- параметры для получения данных из терминала
input string InpSymbolName="EURUSD"; // валютная пара
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_M15; // таймфрейм
input datetime InpDateStart=D'2013.01.01 00:00'; // дата начала копирования данных
//--- параметры для записи данных в файл
input string InpFileName="Close.bin"; // имя файла
input string InpDirectoryName="Data"; // имя директории
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date_finish=TimeCurrent();
double close_buff[];
datetime time_buff[];
int size;
//--- сбросим значение ошибки
ResetLastError();
//--- скопируем цену закрытия для каждого бара
if(CopyClose(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,close_buff)==-1)
{
PrintFormat("Не удалось скопировать значения цен закрытия. Код ошибки = %d",GetLastError());
return;
}
//--- скопируем время для каждого бара
if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
{
PrintFormat("Не удалось скопировать значения времени. Код ошибки = %d",GetLastError());
return;
}
//--- получим размер буфера
size=ArraySize(close_buff);
//--- откроем файл для записи значений (если его нет, то создастся автоматически)
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для записи",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- запишем время и значения цен закрытия в файл
for(int i=0;i<size;i++)
{
uint byteswritten=FileWriteDouble(file_handle,(double)time_buff[i]);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(double))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
byteswritten=FileWriteFloat(file_handle,(float)close_buff[i]);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(float))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
}
//--- закрываем файл
FileClose(file_handle);
PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
}
else
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}

Смотри также

Вещественные типы (double, float), FileWriteDouble()


FileWriteInteger

Справочник MQL4 / Файловые операции / FileWriteInteger

FileWriteInteger

Записывает в bin-файл значение параметра типа int с текущего положения файлового указателя.

uint FileWriteInteger(
int file_handle, // handle файла
int value, // записываемое значение
int size=INT_VALUE // кол-во байт
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

value

[in] Целое значение.

size=INT_VALUE

[in] Количество байт (до 4 включительно), которые нужно записать. Предусмотрены соответствующие константы: CHAR_VALUE=1, SHORT_VALUE=2 и INT_VALUE(LONG_VALUE)=4, таким образом функция может записать целое значение типа char, uchar, short, ushort, int, uint или long.

Возвращаемое значение

В случае удачи функция возвращает количество записанных байт или 0 в случае ошибки. При успешном завершении количество записанных байт равно размеру указанного типа данных. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Файловый указатель перемещается на это же количество байт.

Пример:

//+------------------------------------------------------------------+
//| Demo_FileWriteInteger.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- параметры для получения данных из терминала
input string InpSymbolName="EURUSD"; // Валютная пара
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // Таймфрейм
//--- параметры для записи данных в файл
input string InpFileName="Trend.bin"; // Имя файла
input string InpDirectoryName="Data"; // Имя каталога
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
double close_buff[];
datetime time_buff[];
int size;
//--- установка индексации как в таймсерии
ArraySetAsSeries(close_buff,true);
ArraySetAsSeries(time_buff,true);
//--- сбросим значение ошибки
ResetLastError();
//--- скопируем цену закрытия для каждого бара
if(CopyClose(InpSymbolName,InpSymbolPeriod,0,1000,close_buff)==-1)
{
PrintFormat("Не удалось скопировать значения цен закрытия. Код ошибки = %d",GetLastError());
return;
}
//--- скопируем время для каждого бара
if(CopyTime(InpSymbolName,InpSymbolPeriod,0,1000,time_buff)==-1)
{
PrintFormat("Не удалось скопировать значения времени. Код ошибки = %d",GetLastError());
return;
}
//--- получим размер буфера
size=ArraySize(close_buff);
//--- откроем файл для записи значений (если его нет, то создастся автоматически)
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для записи",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//---
uint byteswritten;// количество записанных байт
int up_down=0; // флаг тенденции
int arr_size; // размера массива arr
uchar arr[]; // массив типа uchar
//--- запишем значения времени в файл
for(int i=0;i<size-1;i++)
{
//--- сравним цены закрытия на текущем и следующем барах
if(close_buff[i]<=close_buff[i+1])
{
if(up_down!=1)
{
//--- запишем значение даты в файл, используя FileWriteInteger
StringToCharArray(TimeToString(time_buff[i]),arr);
arr_size=ArraySize(arr);
//--- сначала запишем количество символов в массиве
byteswritten=FileWriteInteger(file_handle,arr_size,INT_VALUE);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(int))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
//--- запишем сами символы
for(int j=0;j<arr_size;j++)
{
byteswritten=FileWriteInteger(file_handle,arr[j],CHAR_VALUE);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(char))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
}
//--- изменим флаг тенденции
up_down=1;
}
}
else
{
if(up_down!=-1)
{
//--- запишем значение даты в файл, используя FileWriteInteger
StringToCharArray(TimeToString(time_buff[i]),arr);
arr_size=ArraySize(arr);
//--- сначала запишем количество символов в массиве
byteswritten=FileWriteInteger(file_handle,arr_size,INT_VALUE);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(int))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
//--- запишем сами символы
for(int j=0;j<arr_size;j++)
{
byteswritten=FileWriteInteger(file_handle,arr[j],CHAR_VALUE);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(char))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
}
//--- изменим флаг тенденции
up_down=-1;
}
}
}
//--- закрываем файл
FileClose(file_handle);
PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
}
else
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}

Смотри также

IntegerToString(), StringToInteger(), Целые типы


FileWriteLong

Справочник MQL4 / Файловые операции / FileWriteLong

FileWriteLong

Записывает в bin-файл значение параметра типа long с текущего положения файлового указателя.

uint FileWriteLong(
int file_handle, // handle файла
long value // записываемое значение
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

value

[in] Значение типа long.

Возвращаемое значение

В случае удачи функция возвращает количество записанных байт или 0 в случае ошибки. При успешном завершении количество записанных байт равно размеру типа данных (sizeof(long)=8). Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Файловый указатель перемещается на это же количество байт.

Пример:

//+------------------------------------------------------------------+
//| Demo_FileWriteLong.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- параметры для получения данных из терминала
input string InpSymbolName="EURUSD"; // валютная пара
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // таймфрейм
input datetime InpDateStart=D'2013.01.01 00:00'; // дата начала копирования данных
//--- параметры для записи данных в файл
input string InpFileName="Volume.bin"; // имя файла
input string InpDirectoryName="Data"; // имя директории
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date_finish=TimeCurrent();
long volume_buff[];
datetime time_buff[];
int size;
//--- сбросим значение ошибки
ResetLastError();
//--- скопируем тиковые объемы для каждого бара
if(CopyTickVolume(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,volume_buff)==-1)
{
PrintFormat("Не удалось скопировать значения тикового объема. Код ошибки = %d",GetLastError());
return;
}
//--- скопируем время для каждого бара
if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
{
PrintFormat("Не удалось скопировать значения времени. Код ошибки = %d",GetLastError());
return;
}
//--- получим размер буфера
size=ArraySize(volume_buff);
//--- откроем файл для записи значений индикатора (если его нет, то создастся автоматически)
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для записи",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- сначала запишем размер выборки данных
uint byteswritten=FileWriteLong(file_handle,(long)size);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(long))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
//--- запишем время и значения объема в файл
for(int i=0;i<size;i++)
{
byteswritten=FileWriteLong(file_handle,(long)time_buff[i]);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(long))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
byteswritten=FileWriteLong(file_handle,volume_buff[i]);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(long))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
}
//--- закрываем файл
FileClose(file_handle);
PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
}
else
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}

Смотри также

Целые типы, FileWriteInteger()


FileWriteString

Справочник MQL4 / Файловые операции / FileWriteString

FileWriteString

Записывает в файл типа BIN, CSV или TXT значение параметра типа string с текущего положения файлового указателя. При записи в файл типа CSV или TXT, если в строке присутствует символ '\n' (LF) без предшествующего символа '\r' (CR), то перед символом '\n' дописывается отсутствующий символ '\r'.

uint FileWriteString(
int file_handle, // handle файла
const string text_string, // записываемая строка
int length=0 // количество символов
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

text_string

[in] Строка.

length=0

[in] Количество символов, которые нужно записать. Параметр необходим для записи строки в файл типа BIN. Если размер не указан, то записывается вся строка без завершающего 0. Если указан размер меньший, чем длина строки, то записывается часть строки без завершающего 0. Если указан размер больший, чем длина строки, то строка дописывается соответствующим количеством нулей. Для файлов типа CSV и TXT этот параметр игнорируется и строка записывается полностью.

Возвращаемое значение

В случае удачи функция возвращает количество записанных байт или 0 в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Файловый указатель перемещается на это же количество байт.

Примечание

Следует иметь в виду, что при записи в файл, открытый с флагом FILE_UNICODE (либо без флага FILE_ANSI), количество записанных байт будет в 2 раза больше количества записанных символов строки. При записи в файл, открытый с флагом FILE_ANSI, количество записанных байт будет совпадать с количеством записанных символов строки.

Пример:

//+------------------------------------------------------------------+
//| Demo_FileWriteString.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- параметры для получения данных из терминала
input string InpSymbolName="EURUSD"; // Валютная пара
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // Таймфрейм
input int InpMAPeriod=14; // Период скользящей средней
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Тип цены
//--- параметры для записи данных в файл
input string InpFileName="RSI.csv"; // Имя файла
input string InpDirectoryName="Data"; // Имя каталога
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
double rsi_buff[]; // массив значений индикатора
datetime date_buff[]; // массив дат индикатора
int rsi_size=0; // размер массивов индикатора
//--- установим для массивов признак таймсерии
ArraySetAsSeries(rsi_buff,true);
ArraySetAsSeries(date_buff,true);
//--- сбросим код ошибки
ResetLastError();
//--- скопируем таймсерию,содержащую время открытия последних 1000 баров
int copied=CopyTime(NULL,0,0,1000,date_buff);
if(copied<=0)
{
Print("Не удалось скопировать времена открытия за последние 1000 баров");
return;
}
//--- подготовим массив rsi_buff
ArrayResize(rsi_buff,copied);
//--- скопируем значения индикатора iRSI
for(int i=0;i<copied;i++)
{
rsi_buff[i]=iRSI(InpSymbolName,InpSymbolPeriod,InpMAPeriod,InpAppliedPrice,i);
}
//--- получим размер буфера
rsi_size=ArraySize(rsi_buff);
//--- откроем файл для записи значений индикатора (если его нет, то создастся автоматически)
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для записи",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- подготовим вспомогательные переменные
string str="";
bool is_formed=false;
//--- запишем даты формирования зон перекупленности и перепроданности
for(int i=0;i<rsi_size;i++)
{
//--- проверка значений индикатора
if(rsi_buff[i]>=70 || rsi_buff[i]<=30)
{
//--- первое ли значение в этой зоне
if(!is_formed)
{
//--- добавляем значение и дату
str=(string)rsi_buff[i]+"\t"+(string)date_buff[i];
is_formed=true;
}
else
str+="\t"+(string)rsi_buff[i]+"\t"+(string)date_buff[i];
//--- переход на следующую итерацию цикла
continue;
}
//--- проверка флага
if(is_formed)
{
//--- строка сформирована, запишем ее в файл
FileWriteString(file_handle,str+"\r\n");
is_formed=false;
}
}
//--- закрываем файл
FileClose(file_handle);
PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
}
else
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}

Смотри также

Тип string, StringFormat()


FileWriteStruct

Справочник MQL4 / Файловые операции / FileWriteStruct

FileWriteStruct

Записывает в bin-файл содержимое структуры, переданной в качестве параметра, с текущего положения файлового указателя.

uint FileWriteStruct(
int file_handle, // handle файла
const void& struct_object, // ссылка на объект
int size=-1 // размер для записи в байтах
);

Параметры

file_handle

[in] Файловый описатель, возвращаемый функцией FileOpen().

struct_object

[in] Ссылка на объект указанной структуры. Структура не должна содержать строки, динамические массивы и виртуальные функции.

size=-1

[in] Количество байт, которые нужно записать. Если размер не указан или указано большее количество байт, чем размер структуры, то записывается вся структура полностью.

Возвращаемое значение

В случае удачи функция возвращает количество записанных байт или 0 в случае ошибки. При успешном завершении количество записанных байт равно размеру структуры. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Файловый указатель перемещается на это же количество байт.

Пример:

//+------------------------------------------------------------------+
//| Demo_FileWriteStruct.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
#property strict
//--- параметры для получения данных из терминала
input string InpSymbolName="EURUSD"; // валютная пара
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // таймфрейм
input datetime InpDateStart=D'2013.01.01 00:00'; // дата начала копирования данных
//--- параметры для записи данных в файл
input string InpFileName="EURUSD.txt"; // имя файла
input string InpDirectoryName="Data"; // имя директории
//+------------------------------------------------------------------+
//| Структура для хранения данных свечи |
//+------------------------------------------------------------------+
struct candlesticks
{
double open; // цена открытия
double close; // цена закрытия
double high; // максимальная цена
double low; // минимальная цена
datetime date; // дата
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
datetime date_finish=TimeCurrent();
int size;
datetime time_buff[];
double open_buff[];
double close_buff[];
double high_buff[];
double low_buff[];
candlesticks cand_buff[];
//--- сбросим значение ошибки
ResetLastError();
//--- получим время появления баров из диапазона
if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
{
PrintFormat("Не удалось скопировать значения времени. Код ошибки = %d",GetLastError());
return;
}
//--- получим максимальные цены баров из диапазона
if(CopyHigh(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,high_buff)==-1)
{
PrintFormat("Не удалось скопировать значения максимальных цен. Код ошибки = %d",GetLastError());
return;
}
//--- получим минимальные цены баров из диапазона
if(CopyLow(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,low_buff)==-1)
{
PrintFormat("Не удалось скопировать значения минимальных цен. Код ошибки = %d",GetLastError());
return;
}
//--- получим цены открытия баров из диапазона
if(CopyOpen(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,open_buff)==-1)
{
PrintFormat("Не удалось скопировать значения цен открытия. Код ошибки = %d",GetLastError());
return;
}
//--- получим цены закрытия баров из диапазона
if(CopyClose(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,close_buff)==-1)
{
PrintFormat("Не удалось скопировать значения цен закрытия. Код ошибки = %d",GetLastError());
return;
}
//--- определим размерность массивов
size=ArraySize(time_buff);
//--- сохраним все данные в массиве структуры
ArrayResize(cand_buff,size);
for(int i=0;i<size;i++)
{
cand_buff[i].open=open_buff[i];
cand_buff[i].close=close_buff[i];
cand_buff[i].high=high_buff[i];
cand_buff[i].low=low_buff[i];
cand_buff[i].date=time_buff[i];
}

//--- откроем файл для записи массива структуры в файл (если его нет, то создастся автоматически)
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN|FILE_COMMON);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для записи",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
//--- подготовим счетчик количества байт
uint counter=0;
//--- в цикле запишем значения массива
for(int i=0;i<size;i++)
{
uint byteswritten=FileWriteStruct(file_handle,cand_buff[i]);
//--- проверка количества записанных данных
if(byteswritten!=sizeof(candlesticks))
{
PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
//--- закрываем файл
FileClose(file_handle);
return;
}
else
counter+=byteswritten;
}
PrintFormat("В файл %s записано %d байт информации",InpFileName,counter);
PrintFormat("Всего байтов: %d * %d * %d = %d, %s",size,5,8,size*5*8,size*5*8==counter ? "Верно" : "Ошибка");
//--- закрываем файл
FileClose(file_handle);
PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
}
else
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}

Смотри также

Структуры и классы


FolderCreate

Справочник MQL4 / Файловые операции / FolderCreate

FolderCreate

Создает директорию в директории Files (в зависимости от значения common_flag)

bool FolderCreate(
string folder_name, // строка с именем создаваемой папки
int common_flag=0 // область действия
);

Параметры

folder_name

[in] Имя директории, которую требуется создать. Содержит относительный путь к папке.

common_flag=0

[in] Флаг, определяющий местоположение директории. Если common_flag=FILE_COMMON, то директория находится в общей папке всех клиентских терминалов \Terminal\Common\Files. В противном случае директория находится в локальной папке (MQL4\Files или MQL4\Tester\Files в случае тестирования).

Возвращаемое значение

Возвращает true в случае успеха, иначе false.

Примечание

Из соображений безопасности в языке MQL4 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL4, не могут находиться за пределами файловой "песочницы".

Пример:

#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//--- описание
#property description "Скрипт показывает пример использования FolderCreate()."
#property description "Внешний параметр определяет папку для создания папок."
#property description "После выполнения скрипта будет создана структура папок"

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входной параметр определяет папку, в которой работает скрипт
input bool common_folder=false; // общая папка всех терминалов
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- папка, которую создадим в MQL5\Files
string root_folder="Folder_A";
if(CreateFolder(root_folder,common_folder))
{
//--- создадим в ней дочернюю папку Child_Folder_B1
string folder_B1="Child_Folder_B1";
string path=root_folder+"\\"+folder_B1; // создадим имя папки с учетом структуры
if(CreateFolder(path,common_folder))
{
//--- в этой папке создадим еще 3 дочерних
string folder_C11="Child_Folder_C11";
string child_path=root_folder+"\\"+folder_C11;// создадим имя папки с учетом структуры
CreateFolder(child_path,common_folder);
//--- вторая дочерняя папка
string folder_C12="Child_Folder_C12";
child_path=root_folder+"\\"+folder_C12;
CreateFolder(child_path,common_folder);

//--- третья дочерняя папка
string folder_C13="Child_Folder_C13";
child_path=root_folder+"\\"+folder_C13;
CreateFolder(child_path,common_folder);
}
}
//---
}
//+------------------------------------------------------------------+
//| Пытается создать папку и выводит сообщение об этом |
//+------------------------------------------------------------------+
bool CreateFolder(string folder_path,bool common_flag)
{
int flag=common_flag?FILE_COMMON:0;
string working_folder;
//--- выясним полный путь в зависимости от параметра common_flag
if(common_flag)
working_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH)+"\\MQL5\\Files";
else
working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files";
//--- отладочное сообщение
PrintFormat("folder_path=%s",folder_path);
//--- попытка создать папку относительно пути MQL5\Files
if(FolderCreate(folder_path,flag))
{
//--- выведем полный путь для созданной папки
PrintFormat("Cоздали папку %s",working_folder+"\\"+folder_path);
//--- сбросим код ошибки
ResetLastError();
//--- успешное выполнение
return true;
}
else
PrintFormat("Не удалось создать папку %s. Код ошибки %d",working_folder+folder_path,GetLastError());
//--- неудачное выполнение
return false;
}

Смотри также

FileOpen(), FolderClean(), FileCopy()


FolderDelete

Справочник MQL4 / Файловые операции / FolderDelete

FolderDelete

Удаляет указанную директорию. Если папка не пуста, то она не может быть удалена.

bool FolderDelete(
string folder_name, // строка с именем удаляемой папки
int common_flag=0 // область действия
);

Параметры

folder_name

[in] Имя директории, которую требуется удалить. Содержит полный путь к папке.

common_flag=0

[in] Флаг, определяющий местоположение директории. Если common_flag=FILE_COMMON, то директория находится в общей папке всех клиентских терминалов \Terminal\Common\Files. В противном случае директория находится в локальной папке (MQL4\Files или MQL4\Tester\Files в случае тестирования).

Возвращаемое значение

Возвращает true в случае успеха, иначе false.

Примечание

Из соображений безопасности в языке MQL4 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL4, не могут находиться за пределами файловой "песочницы".

Если директория содержит хоть один файл и/или поддиректорию, то удаление такой директории невозможно, ее необходимо предварительно очистить. Тотальная очистка папки от всех файлов и всех вложенных подпапок осуществляется при помощи функции FolderClean().

Пример:

//+------------------------------------------------------------------+
//| Demo_FolderDelete.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//--- описание
#property description "Скрипт показывает пример использования FolderDelete()."
#property description "Сначала создаются две папки, одна пустая, другая содержит файл."
#property description "При попытке удаления непустой папки получим ошибку и предупреждение."

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input string firstFolder="empty"; // пустая папка
input string secondFolder="nonempty";// папка, в которой будет один файл
string filename="delete_me.txt"; // имя файла, который мы создадим в папке secondFolder
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- хендл файла запишем сюда
int handle;
//--- выясним в какой папке мы работаем
string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files";
//--- отладочное сообщение
PrintFormat("working_folder=%s",working_folder);
//--- попытка создать пустую папку относительно пути MQL4\Files
if(FolderCreate(firstFolder,0)) // 0 означает, что работаем в локальной папке терминала
{
//--- выведем полный путь до созданной папки
PrintFormat("Cоздали папку %s",working_folder+"\\"+firstFolder);
//--- сбросим код ошибки
ResetLastError();
}
else
PrintFormat("Не удалось создать папку %s. Код ошибки %d",working_folder+"\\"+firstFolder, GetLastError());

//--- теперь создадим непустую папку с помощью функции FileOpen()
string filepath=secondFolder+"\\"+filename; // сформируем путь для файла, который хотим открыть на запись в несуществующей папке
handle=FileOpen(filepath,FILE_WRITE|FILE_TXT); // флаг FILE_WRITE в данном случае обязателен, см. справку к функции FileOpen
if(handle!=INVALID_HANDLE)
PrintFormat("Открыли файл на чтение %s",working_folder+"\\"+filepath);
else
PrintFormat("Не удалось создать файл %s в папке %s. Код ошибки=",filename,secondFolder, GetLastError());

Comment(StringFormat("Готовимся удалить папки %s и %s", firstFolder, secondFolder));
//--- Небольшая пауза в 5 секунд, чтобы мы могли прочитать сообщение на графике
Sleep(5000); // Sleep() нельзя использовать в индикаторах!

//--- выведем диалоговое окно и просим пользователя
int choice=MessageBox(StringFormat("Удалить папки %s и %s?", firstFolder, secondFolder),
"Удаление папок",
MB_YESNO|MB_ICONQUESTION); // будут две кнопки - "Yes" и "No"

//--- выполним действия в зависимости от выбранного варианта
if(choice==IDYES)
{
//--- очистим комментарий на графике
Comment("");
//--- выведем сообщение в журнал "Эксперты"
PrintFormat("Пробуем удалить папки %s и %s",firstFolder, secondFolder);
ResetLastError();
//--- удаляем пустую папку
if(FolderDelete(firstFolder))
//--- должны увидеть это сообщение, так как папка пустая
PrintFormat("Папка %s успешно удалена",firstFolder);
else
PrintFormat("Не удалось удалить папку %s. Код ошибки=%d", firstFolder, GetLastError());

ResetLastError();
//--- удаляем папку, которая содержит файл
if(FolderDelete(secondFolder))
PrintFormat("Папка %s успешно удалена", secondFolder);
else
//--- должны увидеть это сообщение, так как в папке есть файл
PrintFormat("Не удалось удалить папку %s. Код ошибки=%d", secondFolder, GetLastError());
}
else
Print("Удаление отменено");
//---
}

Смотри также

FileOpen(), FolderClean(), FileMove()


FolderClean

Справочник MQL4 / Файловые операции / FolderClean

FolderClean

Удаляет все файлы в указанной папке.

bool FolderClean(
string folder_name, // строка с именем папки
int common_flag=0 // область действия
);

Параметры

folder_name

[in] Имя директории, в которой требуется удалить все файлы. Содержит полный путь к папке.

common_flag=0

[in] Флаг, определяющий местоположение директории. Если common_flag=FILE_COMMON, то директория находится в общей папке всех клиентских терминалов \Terminal\Common\Files. В противном случае директория находится в локальной папке (MQL4\Files или MQL4\Tester\Files в случае тестирования).

Возвращаемое значение

Возвращает true в случае успеха, иначе false.

Примечание

Из соображений безопасности в языке MQL4 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL4, не могут находиться за пределами "файловой песочницы".

Осторожно пользуйтесь этой функцией, так как все файлы и все вложенные поддиректории удаляются безвозвратно.

Пример:

//+------------------------------------------------------------------+
//| Demo_FolderClean.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//--- описание
#property description "Скрипт показывает пример использования FolderClean()."
#property description "Сначала создаются файлы в указанной папке с помощью функции FileOpen()."
#property description "Затем перед удалением файлов выводится предупреждение MessageBox()."

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры
input string foldername="demo_folder"; // создаем папку в MQL4/Files/
input int files=5; // сколько файлов создадим и удалим
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string name="testfile";
//--- сначала откроем или создадим файлы в папке данных нашего терминала
for(int N=0;N<files;N++)
{
//--- соберем имя файла в виде 'demo_folder\testfileN.txt'
string filemane=StringFormat("%s\\%s%d.txt",foldername,name,N);
//--- открываем файл с флагом на запись, в этом случае папка 'demo_folder' будет создана автоматически
int handle=FileOpen(filemane,FILE_WRITE);
//--- выясним, насколько успешно отработала функция FileOpen()
if(handle==INVALID_HANDLE)
{
PrintFormat("Не удалось создать файл %s. Код ошибки ",filemane,GetLastError());
ResetLastError();
}
else
{
PrintFormat("Файл %s успешно открыт",filemane);
//--- открытый файл нам больше не нужен, обязательно закрываем
FileClose(handle);
}
}

//--- проверим, сколько файлов в папке
int k=FilesInFolder(foldername+"\\*.*",0);
PrintFormat("Всего в папке %s найдено %d файлов",foldername,k);

//--- выведем диалоговое окно и спросим пользователя
int choice=MessageBox(StringFormat("Вы собираетесь удалить из папки %s %d файлов, продолжить?",foldername,k),
"Удаление файлов из папки",
MB_YESNO|MB_ICONQUESTION); // будут две кнопки - "Yes" и "No"
ResetLastError();

//--- выполним действия в зависимости от выбранного варианта
if(choice==IDYES)
{
//--- начинаем удалять
PrintFormat("Попытка удалить все файлы из папки %s",foldername);
if(FolderClean(foldername,0))
PrintFormat("Файлы успешно удалены, в папке %s осталось %d файлов",
foldername,
FilesInFolder(foldername+"\\*.*",0));
else
PrintFormat("Не удалось удалить файлы из папки %s. Код ошибки %d",foldername,GetLastError());
}
else
PrintFormat("Удаление отменено");
//---
}
//+------------------------------------------------------------------+
//| возвращает количество файлов в указанной папке |
//+------------------------------------------------------------------+
int FilesInFolder(string path,int flag)
{
int count=0;
long handle;
string filename;
//---
handle=FileFindFirst(path,filename,flag);
//--- если хотя бы один файл найден, ищем остальные
if(handle!=INVALID_HANDLE)
{
//--- выведем имя файла
PrintFormat("найден файл %s",filename);
//--- увеличим счетчик найденный файлов/папок
count++;
//--- начинаем перебор всех файлов/папок
while(FileFindNext(handle,filename))
{
PrintFormat("найден файл %s",filename);
count++;
}
//--- обязательно закрываем хендл поиска по окончании
FileFindClose(handle);
}
else // хендл получить не удалось
{
PrintFormat("Не удалось провести поиск файлов в папке %s",path);
}
//--- вернем результат
return count;
}

Смотри также

FileFindFirst(), FileFindNext(), FileFindClose()


FileOpenHistory

Справочник MQL4 / Файловые операции / FileOpenHistory

FileOpenHistory

Открывает файл в текущей папке истории (каталог_терминала\history\server_name) или ее подпапках.

int FileOpenHistory(
int filename, // имя файла
int mode, // режим открытия
int delimiter=';' // разделитель
);

Параметры

filename

[in] Имя файла.

mode

[in] Режим открытия. Это может быть одна величина или их комбинация: FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE.

delimiter=';'

[in] Знак разделителя для csv-файлов. По умолчанию применяется символ ';'.

Возвращаемое значение

Возвращает хендл файла или -1 в случае неудачи. Для получения дополнительной информации об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Клиентский терминал может подключаться к серверам разных брокерских компаний. Исторические данные (файлы HST) каждой брокерской компании хранятся в соответствующей подпапке папки истории каталог_терминала\history. Функция может быть полезна для формирования собственных исторических данных нестандартного символа и/или периода. Файл, сформированный в папке истории может быть открыт автономно, для его графика не требуется подкачка данных.

Следует иметь в виду, что в старом MQL4 все файлы открывались в режиме совместного использования. В новом MQL4 при открытии файлов необходимо явно указывать флаги FILE_SHARE_WRITE и FILE_SHARE_READ для совместного использования. В случае их отсутствия файл будет открыт в монопольном режиме, что не позволит больше никому его открывать, пока он не будет закрыт монополистом (см. "Оффлайновые графики и новый MQL4").

Пример:

int handle=FileOpenHistory("USDX240.HST",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);
if(handle<1)
{
Print("Ошибка открытия файла USDX240.HST");
return(false);
}
// работа с файлом
// ...
FileClose(handle);


Пользовательские индикаторы

Справочник MQL4 / Пользовательские индикаторы

Пользовательские индикаторы

Группа функций, используемых при оформлении пользовательских индикаторов. Данные функции нельзя использовать при написании советников и скриптов.

Функция | Действие
HideTestIndicators | Выставляет флаг скрытия индикаторов, вызываемых экспертом
IndicatorSetDouble | Задает значение свойства индикатора, имеющего тип double
IndicatorSetInteger | Задает значение свойства индикатора,имеющего тип int
IndicatorSetString | Задает значение свойства индикатора, имеющего тип string
SetIndexBuffer | Связывает указанный индикаторный буфер с одномерным динамическим массивом типа double
IndicatorBuffers | Распределяет память для буферов, используемых для вычислений пользовательского индикатора
IndicatorCounted | Возвращает количество баров, не измененных после последнего вызова индикатора
IndicatorDigits | Устанавливает формат точности (количество знаков после десятичной точки) для визуализации значений индикатора
IndicatorShortName | Устанавливает "короткое" имя пользовательского индикатора для отображения в подокне индикатора и в окне DataWindow
SetIndexArrow | Устанавливает значок для линии индикаторов, имеющей стиль DRAW_ARROW
SetIndexDrawBegin | Устанавливает порядковый номер бара от начала данных, с которого должна начинаться отрисовка указанной линии индикатора
SetIndexEmptyValue | Устанавливает значение пустой величины для линии индикатора
SetIndexLabel | Устанавливает текст описания линии индикатора для отображения информации в окне DataWindow и всплывающей подсказке
SetIndexShift | Устанавливает смещение линии индикатора относительно начала графика
SetIndexStyle | Устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора
SetLevelStyle | Устанавливает новый стиль, ширину и цвет для горизонтальных уровней индикатора, выводимого в отдельное окно
SetLevelValue | Устанавливает значение указанного горизонтального уровня индикатора, выводимого в отдельное окно

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

Все необходимые расчеты пользовательских индикаторов необходимо размещать в предопределенной функции OnCalculate().

Что нового в MQL5

Для создания пользовательских индикаторов программистам на MQL4 доступно 8 буферов и 6 стилей рисования. В MQL5 этот набор был существенно увеличен – теперь можно использовать до 512 индикаторных буферов и 18 стилей отрисовки. Кроме того, теперь для вычисления значений индикаторов не обязательно использовать индексацию таймсерий, при которой расчет ведется от настоящего к прошлому. Такой подход очень удобен для написания советников, но вызвывает сложности при работе с индикаторными буферами в циклах. Теперь направление индексации в массивах можно задавать самому, и писать индикаторы стало писать гораздо проще.

Еще одна интересная возможность языка MQL5 – динамическое изменение стиля рисования с помощью функций PlotIndexSetXXX. Например, при наступлении определенного условия можно на лету изменить цвет, стиль и толщину линии индикатора, цвет и код стрелки.

Для расчета значений индикатора добавлен еще один обработчик OnCalculate(), который позволяет вычислять значения индикатора на основе другого индикатора. Таким образом, В MQL5 пользовательские индикаторы можно накладывать на другие индикаторы (например, TEMA от MACD), и тем самым получать новые комбинации индикаторов для быстрой проверки идей без программирования.


HideTestIndicators

Справочник MQL4 / Пользовательские индикаторы / HideTestIndicators

HideTestIndicators

Выставляет флаг скрытия индикаторов, вызываемых экспертом.

void HideTestIndicators(
bool hide // флаг
);

Параметры

hide

[in] Флаг (true - если нужно прятать индикаторы, иначе false).

Возвращаемое значение

Нет.

Примечание

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

Пример:

HideTestIndicators(true);
MaCurrent=iMA(NULL,0,56,0,MODE_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,56,0,MODE_EMA,PRICE_CLOSE,1);
HideTestIndicators(false);


IndicatorSetDouble

Справочник MQL4 / Пользовательские индикаторы / IndicatorSetDouble

IndicatorSetDouble

Задаёт значение соответствующего свойства индикатора. Свойство индикатора должно быть типа double. Существует 2 варианта функции.

Вызов с указанием идентификатора свойства.

bool IndicatorSetDouble(
int prop_id, // идентификатор
double prop_value // устанавливаемое значение
);

Вызов с указанием идентификатора и модификатора свойства.

bool IndicatorSetDouble(
int prop_id, // идентификатор
int prop_modifier, // модификатор
double prop_value // устанавливаемое значение
)

Параметры

prop_id

[in] Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_CUSTOMIND_PROPERTY_DOUBLE.

prop_modifier

[in] Модификатор указанного свойства. Только свойства уровней требуют модификатора. Нумерация уровней идет с 0, то есть для задания свойства второму уровню нужно указать единицу (на 1 меньше, чем при использовании директивы компилятора).

prop_value

[in] Значение свойства.

Возвращаемое значение

В случае успешного выполнения возвращает true, в противном случае false.

Примечание

Нумерация свойств (модификаторов) при использовании директивы #property начинается с 1 (единицы), в то время как функция использует нумерацию с 0 (нуля). При неправильном задании номера уровня отображение индикатора может отличаться от того, которое предполагается.

Например, задать значение первого уровня для индикатора в отдельном подокне можно двумя способами:

  • property indicator_level1 50 - используется 1 для указания номера уровня,
  • IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, 50) - используется 0 для указания первого уровня.

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

Пример использования функции IndicatorSetDouble()

#property indicator_separate_window
//--- установим максимальное и минимальное значения для окна индикатора
#property indicator_minimum 0
#property indicator_maximum 100
//--- зададим показ двух горизонтальных уровней в отдельном окне индикатора
#property indicator_level1 25
#property indicator_level2 75
//--- установим толщину горизонтальных уровней
#property indicator_levelwidth 1
//--- установим стиль горизонтальных уровней
#property indicator_levelstyle STYLE_DOT
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- задаем 2 уровня
IndicatorSetInteger(INDICATOR_LEVELS,2);
//--- зададим описания горизонтальных уровней
IndicatorSetString(INDICATOR_LEVELTEXT,0,"First Level (index 0)");
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Second Level (index 1)");
//--- зададим короткое имя индикатора
IndicatorSetString(INDICATOR_SHORTNAME,"IndicatorSetDouble() Demo");
//--- зададим всем уровням цвет Blue
IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrBlue);
//--- успешная инициализация
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[])
{
static int tick_counter=0;
static double level1=25,level2=75;
static int delta=1;
//--- считаем тики
tick_counter+=delta;
//--- проверяем границы диапазона изменений
if(tick_counter<0) delta=5;
if(tick_counter>25) delta=-5;
//--- изменяем значения уровней
level1+=delta;
level2-=delta;
//--- зададим новые значения уровней
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,level1);
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,level2);
//--- return value of prev_calculated for next call
return(rates_total);
}

Смотри также

Стили рисования


IndicatorSetInteger

Справочник MQL4 / Пользовательские индикаторы / IndicatorSetInteger

IndicatorSetInteger

Задает значение соответствующего свойства индикатора. Свойство индикатора должно быть типа int или color. Существует 2 варианта функции.

Вызов с указанием идентификатора свойства.

bool IndicatorSetInteger(
int prop_id, // идентификатор
int prop_value // устанавливаемое значение
);

Вызов с указанием идентификатора и модификатора свойства.

bool IndicatorSetInteger(
int prop_id, // идентификатор
int prop_modifier, // модификатор
int prop_value // устанавливаемое значение
)

Параметры

prop_id

[in] Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_CUSTOMIND_PROPERTY_INTEGER.

prop_modifier

[in] Модификатор указанного свойства. Только свойства уровней требуют модификатора.

prop_value

[in] Значение свойства.

Возвращаемое значение

В случае успешного выполнения возвращает true, в противном случае false.

Примечание

Нумерация свойств (модификаторов) при использовании директивы #property начинается с 1 (единицы), в то время как функция использует нумерацию с 0 (нуля). При неправильном задании номера уровня отображение индикатора может отличаться от того, которое предполагается.

Пример: индикатор, меняющий значения цвета и стиля горизонтальных уровней.

Пример использования функции IndicatorSetDouble()

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
//--- зададим показ трех горизонтальных уровней в отдельном окне индикатора
#property indicator_level1 20
#property indicator_level2 50
#property indicator_level3 80
//--- установим толщину горизонтальных уровней
#property indicator_levelwidth 5
//--- установим цвет горизонтальных уровней
#property indicator_levelcolor clrAliceBlue
//--- установим стиль горизонтальных уровней
#property indicator_levelstyle STYLE_DOT
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- зададим описания горизонтальных уровней
IndicatorSetString(INDICATOR_LEVELTEXT,0,"First Level (index 0)");
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Second Level (index 1)");
IndicatorSetString(INDICATOR_LEVELTEXT,2,"Third Level (index 2)");
//--- зададим короткое имя индикатора
IndicatorSetString(INDICATOR_SHORTNAME,"IndicatorSetInteger()");
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[])
{
static int tick_counter=0;
//--- считаем тики
tick_counter++;
//--- и устанавливаем цвет горизонтальных уровней в зависимости от счетчика тиков
ChangeLevelsColor(tick_counter,3,6,10); // три последних параметра переключают цвет
//--- поменяем стили горизонтальных уровней
ChangeLevelStyle(tick_counter);
//--- получим толщину линии как остаток целочисленного деления числа тиков на 5
int width=tick_counter%5;
//--- установим толщину горизонтальных уровней
IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,width+1);
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| Установим цвет горизонтальной линии в отдельном окне индикатора |
//+------------------------------------------------------------------+
void ChangeLevelsColor(int tick_number,// делимое, число для получения остатка деления
int f_trigger, // первый делитель переключения цвета
int s_trigger, // второй делитель переключения цвета
int t_trigger) // третий делитель переключения цвета
{
static color colors[3]={clrRed,clrBlue,clrGreen};
//--- индекс цвета из массива colors[]
int index=-1;
//--- вычислим номер цвета из массива colors[] для раскрашивания горизонтальной линии
if(tick_number%f_trigger==0)
index=0; // если число tick_number делится без остатка на f_trigger
if(tick_number%s_trigger==0)
index=1; // если число tick_number делится без остатка на s_trigger
if(tick_number%t_trigger==0)
index=2; // если число tick_number делится без остатка на t_trigger
//--- если цвет определен, установим его
if(index!=-1)
IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,colors[index]);
//---
}
//+------------------------------------------------------------------+
//| Установим стиль горизонтальных линий в отдельном окне индикатора |
//+------------------------------------------------------------------+
void ChangeLevelStyle(int tick_number) // число для получения остатка от деления
{
//--- массив для хранения стилей
static ENUM_LINE_STYLE styles[5]=
{STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//--- индекс стиля из массива styles[]
int index=-1;
//--- вычислим номер из массива styles[] для установки стиля горизонтальной линии
if(tick_number%50==0)
index=5; // если tick_number делится без остатка на 50, то стиль STYLE_DASHDOTDOT
if(tick_number%40==0)
index=4; // ... стиль STYLE_DASHDOT
if(tick_number%30==0)
index=3; // ... STYLE_DOT
if(tick_number%20==0)
index=2; // ... STYLE_DASH
if(tick_number%10==0)
index=1; // ... STYLE_SOLID
//--- если стиль определен, установим его
if(index!=-1)
IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,styles[index]);
}

Смотри также

Свойства пользовательских индикаторов, Свойства программ (#property), Стили рисования


IndicatorSetString

Справочник MQL4 / Пользовательские индикаторы / IndicatorSetString

IndicatorSetString

Задает значение соответствующего свойства индикатора. Свойство индикатора должно быть типа string. Существует 2 варианта функции.

Вызов с указанием идентификатора свойства.

bool IndicatorSetString(
int prop_id, // идентификатор
string prop_value // устанавливаемое значение
);

Вызов с указанием идентификатора и модификатора свойства.

bool IndicatorSetString(
int prop_id, // идентификатор
int prop_modifier, // модификатор
string prop_value // устанавливаемое значение
)

Параметры

prop_id

[in] Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_CUSTOMIND_PROPERTY_STRING.

prop_modifier

[in] Модификатор указанного свойства. Только свойства уровней требуют модификатора.

prop_value

[in] Значение свойства.

Возвращаемое значение

В случае успешного выполнения возвращает true, в противном случае false.

Примечание

Нумерация свойств (модификаторов) при использовании директивы #property начинается с 1 (единицы), в то время как функция использует нумерацию с 0 (нуля). При неправильном задании номера уровня отображение индикатора может отличаться от того, которое предполагается.

Например, чтобы задать описание первого горизонтального уровня, используйте нулевой индекс:

  • IndicatorSetString(INDICATOR_LEVELTEXT, 0, "First Level") - используется индекс 0 для задания текстового описания первого уровня.

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

Пример использования функции IndicatorSetString()

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
//--- зададим показ трех горизонтальных уровней в отдельном окне индикатора
#property indicator_level1 30
#property indicator_level2 50
#property indicator_level3 70
//--- установим цвет горизонтальных уровней
#property indicator_levelcolor clrRed
//--- установим стиль горизонтальных уровней
#property indicator_levelstyle STYLE_SOLID
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- зададим описания горизонтальных уровней
IndicatorSetString(INDICATOR_LEVELTEXT,0,"First Level (index 0)");
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Second Level (index 1)");
IndicatorSetString(INDICATOR_LEVELTEXT,2,"Third Level (index 2)");
//--- зададим короткое имя индикатора
IndicatorSetString(INDICATOR_SHORTNAME,"IndicatorSetString() Demo");
//---
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[])
{
//---

//--- return value of prev_calculated for next call
return(rates_total);
}

Смотри также

Свойства пользовательских индикаторов, Свойства программ (#property)


SetIndexBuffer

Справочник MQL4 / Пользовательские индикаторы / SetIndexBuffer

SetIndexBuffer

Связывает указанный индикаторный буфер с одномерным динамическим массивом типа double. Существует 2 варианта функции.

bool SetIndexBuffer(
int index, // индекс буфера
double buffer[], // массив
ENUM_INDEXBUFFER_TYPE data_type // что будем хранить
);

Вызов без указания типа данных индикаторного массива:

bool SetIndexBuffer(
int index, // индекс буфера
double buffer[] // массив
);

Параметры

index

[in] Номер индикаторного буфера. Нумерация начинается с 0. Номер должен быть меньше значения, объявленного в #property indicator_buffers.

buffer[]

[in] Массив, объявленный в программе пользовательского индикатора.

Возвращаемое значение

В случае успешного выполнения возвращает true, в противном случае false.

Примечание

После связывания динамический массив buffer[] будет иметь индексацию как в обычных массивах, даже если для связываемого массива будет предварительно установлена индексация как в таймсериях. Если необходимо изменить порядок доступа к элементам индикаторного массива, необходимо применить функцию ArraySetAsSeries() после связывания массива функцией SetIndexBuffer(). При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала.

Пример:

double ExtBufferSilver[];
int init()
{
SetIndexBuffer(0, ExtBufferSilver); // буфер для первой линии
// ...
}

Смотри также

Свойства пользовательских индикаторов, Доступ к таймсериям и индикаторам


IndicatorBuffers

Справочник MQL4 / Пользовательские индикаторы / IndicatorBuffers

IndicatorBuffers

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

bool IndicatorBuffers(
int count // количество расчетных буферов
);

Параметры

count

[in] Количество расчетных буферов (от indicator_buffers до 512).

Возвращаемое значение

true, если количество буферов было изменено, иначе false.

Примечание

Количество буферов не может превышать 512, а также не может быть меньше значения, указанного в свойстве #property indicator_buffers. Если пользовательский индикатор требует дополнительных буферов для расчета, то необходимо использовать функцию IndicatorBuffers() для указания общего числа буферов.

Пример:

//+------------------------------------------------------------------+
//| Bulls.mq4 |
//| Copyright 2005-2013, MetaQuotes Software Corp. |
//| https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2005-2013, MetaQuotes Software Corp."
#property link "https://www.mql4.com"
#property description "Bulls Power"
#property strict
//--- настройки индикатора
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Silver
//--- входные параметры индикатора
input int InpBullsPeriod=13;
//--- индикаторные буферы
double ExtBullsBuffer[];
double ExtTempBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit(void)
{
string short_name;
//--- для расчета будет использоваться один дополнительный буфер
IndicatorBuffers(2);
IndicatorDigits(Digits);
//--- стиль отрисовки
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,ExtBullsBuffer);
SetIndexBuffer(1,ExtTempBuffer);
//--- имя для отображения в DataWindow
short_name="Bulls("+IntegerToString(InpBullsPeriod)+")";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
}
//+------------------------------------------------------------------+
//| Bulls Power |
//+------------------------------------------------------------------+
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[])
{
int limit=rates_total-prev_calculated;
//---
if(rates_total<=InpBullsPeriod)
return(0);
//---
if(prev_calculated>0)
limit++;
for(int i=0; i<limit; i++)
{
ExtTempBuffer[i]=iMA(NULL,0,InpBullsPeriod,0,MODE_EMA,PRICE_CLOSE,i);
ExtBullsBuffer[i]=high[i]-ExtTempBuffer[i];
}
//---
return(rates_total);
}

Смотри также

Свойства пользовательских индикаторов, Доступ к таймсериям и индикаторам


IndicatorCounted

Справочник MQL4 / Пользовательские индикаторы / IndicatorCounted

IndicatorCounted

Возвращает количество баров, не измененных после последнего вызова индикатора.

int IndicatorCounted();

Возвращаемое значение

Количество баров, не измененных после последнего вызова индикатора.

Примечание

Большинство подсчитанных баров не нуждается в пересчете. Функция используется для оптимизации вычислений.

Пример:

int start()
{
int limit;
int counted_bars=IndicatorCounted();
//---- последний посчитанный бар будет пересчитан
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- основной цикл
for(int i=0; i<limit; i++)
{
//---- ma_shift присваивается 0, потому что SetIndexShift, вызываемый выше
ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
}
//----
return(0);
}

Смотри также

Свойства пользовательских индикаторов, Доступ к таймсериям и индикаторам


IndicatorDigits

Справочник MQL4 / Пользовательские индикаторы / IndicatorDigits

IndicatorDigits

Устанавливает формат точности (количество знаков после десятичной точки) для визуализации значений индикатора.

void IndicatorDigits(
int digits // количество знаков
);

Параметры

digits

[in] Формат точности, число цифр после десятичной точки.

Возвращаемое значение

Нет.

Примечание

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

Пример:

int init()
{
//---- 2 дополнительных буфера используются для подсчета.
IndicatorBuffers(3);
//---- настройка параметров отрисовки
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);
SetIndexDrawBegin(0,SignalSMA);
IndicatorDigits(Digits+2);
//---- 3 распределенных буферов индикатора
SetIndexBuffer(0,ind_buffer1);
SetIndexBuffer(1,ind_buffer2);
SetIndexBuffer(2,ind_buffer3);
//---- "короткое имя" для DataWindow и подокна индикатора
IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//---- инициализация сделана
return(0);
}

Смотри также

Свойства пользовательских индикаторов


IndicatorShortName

Справочник MQL4 / Пользовательские индикаторы / IndicatorShortName

IndicatorShortName

Устанавливает "короткое" имя пользовательского индикатора для отображения в подокне индикатора и в окне DataWindow.

void IndicatorShortName(
string name // имя
);

Параметры

name

[in] Новое короткое имя.

Возвращаемое значение

Нет.

Пример:

int init()
{
//---- 2 дополнительных буфера используются для подсчета.
IndicatorBuffers(3);
//---- настройка параметров отрисовки
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);
SetIndexDrawBegin(0,SignalSMA);
IndicatorDigits(Digits+2);
//---- 3 распределенных буферов индикатора
SetIndexBuffer(0,ind_buffer1);
SetIndexBuffer(1,ind_buffer2);
SetIndexBuffer(2,ind_buffer3);
//---- "короткое имя" для DataWindow и подокна индикатора
IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//---- инициализация сделана
return(0);
}

Смотри также

Свойства пользовательских индикаторов


SetIndexArrow

Справочник MQL4 / Пользовательские индикаторы / SetIndexArrow

SetIndexArrow

Устанавливает значок для линии индикаторов, имеющей стиль DRAW_ARROW.

void SetIndexArrow(
int index, // номер линии
int code // код символа
);

Параметры

index

[in] Порядковый номер линии. Должен быть от 0 до 7.

code

[in] Код символа из шрифта Wingdings или одна из предопределенных стрелок.

Возвращаемое значение

Нет.

Примечание

Нельзя использовать коды стрелок вне диапазона 33-255.

Пример:

int init()
{
//---- 2 распределенных буфера индикатора
SetIndexBuffer(0,ExtUppperBuffer);
SetIndexBuffer(1,ExtLowerBuffer);
//---- настройка параметров отрисовки
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,217);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,218);
//---- отображение в DataWindow
SetIndexLabel(0,"Fractal Up");
SetIndexLabel(1,"Fractal Down");
//---- инициализация сделана
return(0);
}

Смотри также

Свойства пользовательских индикаторов


SetIndexDrawBegin

Справочник MQL4 / Пользовательские индикаторы / SetIndexDrawBegin

SetIndexDrawBegin

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

void SetIndexDrawBegin(
int index, // номер линии
int begin // номер позиции
);

Параметры

index

[in] Порядковый номер линии. Должен быть от 0 до 7.

begin

[in] Номер позиции начала отрисовки линии индикатора.

Возвращаемое значение

Нет.

Примечание

Отрисовка индикатора производится слева направо. Значения индикаторного массива, находящиеся левее указанного бара, не будут рисоваться на графике и отображаться в окне DataWindow. По умолчанию устанавливается значение 0.

Пример:

//+------------------------------------------------------------------+
//| Alligator.mq4 |
//| Copyright 2005-2013, MetaQuotes Software Corp. |
//| https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2005-2013, MetaQuotes Software Corp."
#property link "https://www.mql4.com"
#property description "Bill Williams' Alligator"
#property strict
//--- настройки индикатора
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Lime
//--- входные параметры индикатора
input int InpJawsPeriod=13; // Jaws Period
input int InpJawsShift=8; // Jaws Shift
input int InpTeethPeriod=8; // Teeth Period
input int InpTeethShift=5; // Teeth Shift
input int InpLipsPeriod=5; // Lips Period
input int InpLipsShift=3; // Lips Shift
//--- индикаторные буферы
double ExtBlueBuffer[];
double ExtRedBuffer[];
double ExtLimeBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit(void)
{
IndicatorDigits(Digits);
//--- установка сдвига линий при отрисовке
SetIndexShift(0,InpJawsShift);
SetIndexShift(1,InpTeethShift);
SetIndexShift(2,InpLipsShift);
//--- пропуск отрисовки первых баров
SetIndexDrawBegin(0,InpJawsShift+InpJawsPeriod);
SetIndexDrawBegin(1,InpTeethShift+InpTeethPeriod);
SetIndexDrawBegin(2,InpLipsShift+InpLipsPeriod);
//--- 3 индикаторных буфера
SetIndexBuffer(0,ExtBlueBuffer);
SetIndexBuffer(1,ExtRedBuffer);
SetIndexBuffer(2,ExtLimeBuffer);
//--- тип отрисовки в виде линий
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);
SetIndexStyle(2,DRAW_LINE);
//---- метки линий
SetIndexLabel(0,"Gator Jaws");
SetIndexLabel(1,"Gator Teeth");
SetIndexLabel(2,"Gator Lips");
}
//+------------------------------------------------------------------+
//| Bill Williams' Alligator |
//+------------------------------------------------------------------+
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[])
{
int limit=rates_total-prev_calculated;
//--- основной цикл расчета
for(int i=0; i<limit; i++)
{
ExtBlueBuffer[i]=iMA(NULL,0,InpJawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
ExtRedBuffer[i]=iMA(NULL,0,InpTeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
ExtLimeBuffer[i]=iMA(NULL,0,InpLipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
}
//---
return(rates_total);
}
//+------------------------------------------------------------------+

Смотри также

Свойства пользовательских индикаторов


SetIndexEmptyValue

Справочник MQL4 / Пользовательские индикаторы / SetIndexEmptyValue

SetIndexEmptyValue

Устанавливает значение пустой величины для линии индикатора.

void SetIndexEmptyValue(
int index, // номер линии
double value // новое значение
);

Параметры

index

[in] Порядковый номер линии. Должен быть от 0 до 7.

value

[in] Новое "пустое" значение.

Возвращаемое значение

Нет.

Примечание

Пустые значения не рисуются и не показываются в DataWindow. По умолчанию значение пустой величины - EMPTY_VALUE.

Пример:

int init()
{
//---- 2 распределенных буфера индикатора
SetIndexBuffer(0,ExtUppperBuffer);
SetIndexBuffer(1,ExtLowerBuffer);
//---- настройка параметров отрисовки
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,217);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,218);
//---- значение 0 отображаться не будет
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
//---- отображение в DataWindow
SetIndexLabel(0,"Fractal Up");
SetIndexLabel(1,"Fractal Down");
//---- инициализация сделана
return(0);
}

Смотри также

Свойства пользовательских индикаторов


SetIndexLabel

Справочник MQL4 / Пользовательские индикаторы / SetIndexLabel

SetIndexLabel

Устанавливает текст описания линии индикатора для отображения информации в окне DataWindow и всплывающей подсказке.

void SetIndexLabel(
int index, // номер линии
string text // текст описания
);

Параметры

index

[in] Порядковый номер линии. Должен быть от 0 до 7.

text

[in] Текст описания линии индикатора. NULL означает, что значение этой линии не показывается в DataWindow.

Возвращаемое значение

Нет.

Пример:

//+------------------------------------------------------------------+
//| Функция инициализации Ichimoku Kinko Hyo |
//+------------------------------------------------------------------+
int init()
{
//---- линия Tenkan Sen
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,Tenkan_Buffer);
SetIndexDrawBegin(0,Tenkan-1);
SetIndexLabel(0,"Tenkan Sen");
//---- линия Kijun Sen
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,Kijun_Buffer);
SetIndexDrawBegin(1,Kijun-1);
SetIndexLabel(1,"Kijun Sen");
//---- гистограмма облака Kumo Up
a_begin=Kijun; if(a_begin<Tenkan) a_begin=Tenkan;
SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_DOT);
SetIndexBuffer(2,SpanA_Buffer);
SetIndexDrawBegin(2,Kijun+a_begin-1);
SetIndexShift(2,Kijun);
//---- в DataWindow не показываем, так как есть ограничивающая линия Senkou Span A
SetIndexLabel(2,NULL);
//---- линия Senkou Span A
SetIndexStyle(5,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(5,SpanA2_Buffer);
SetIndexDrawBegin(5,Kijun+a_begin-1);
SetIndexShift(5,Kijun);
SetIndexLabel(5,"Senkou Span A");
//---- гистограмма облака Kumo Down
SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_DOT);
SetIndexBuffer(3,SpanB_Buffer);
SetIndexDrawBegin(3,Kijun+Senkou-1);
SetIndexShift(3,Kijun);
//---- в DataWindow не показываем, так как есть ограничивающая линия Senkou Span B
SetIndexLabel(3,NULL);
//---- линия Senkou Span B
SetIndexStyle(6,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(6,SpanB2_Buffer);
SetIndexDrawBegin(6,Kijun+Senkou-1);
SetIndexShift(6,Kijun);
SetIndexLabel(6,"Senkou Span B");
//---- линия Chinkou Span
SetIndexStyle(4,DRAW_LINE);
SetIndexBuffer(4,Chinkou_Buffer);
SetIndexShift(4,-Kijun);
SetIndexLabel(4,"Chinkou Span");
//----
return(0);
}

Смотри также

Свойства пользовательских индикаторов


SetIndexShift

Справочник MQL4 / Пользовательские индикаторы / SetIndexShift

SetIndexShift

Устанавливает смещение линии индикатора относительно начала графика.

void SetIndexShift(
int index, // номер линии
int shift // смещение
);

Параметры

index

[in] Порядковый номер линии. Должен быть от 0 до 7.

shift

[in] Величина смещения в барах.

Возвращаемое значение

Нет.

Примечание

При положительном значении изображение линии смещается вправо, при отрицательном - влево. Значение, рассчитанное на текущем баре, рисуется с указанным смещением относительно текущего бара.

Пример:

//+------------------------------------------------------------------+
//| Функция инициализации Аллигатора |
//+------------------------------------------------------------------+
int init()
{
//---- смещение линий баланса относительно начала графика
SetIndexShift(0,JawsShift);
SetIndexShift(1,TeethShift);
SetIndexShift(2,LipsShift);
//---- начала линий баланса должны быть пропущены при отрисовке
SetIndexDrawBegin(0,JawsShift+JawsPeriod);
SetIndexDrawBegin(1,TeethShift+TeethPeriod);
SetIndexDrawBegin(2,LipsShift+LipsPeriod);
//---- 3 распределенных буфера индикатора
SetIndexBuffer(0,ExtBlueBuffer);
SetIndexBuffer(1,ExtRedBuffer);
SetIndexBuffer(2,ExtLimeBuffer);
//---- установка стилей линий
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);
SetIndexStyle(2,DRAW_LINE);
//---- имена линий для отображения в DataWindow
SetIndexLabel(0,"Gator Jaws");
SetIndexLabel(1,"Gator Teeth");
SetIndexLabel(2,"Gator Lips");
//---- инициализация сделана
return(0);
}

Смотри также

Свойства пользовательских индикаторов


SetIndexStyle

Справочник MQL4 / Пользовательские индикаторы / SetIndexStyle

SetIndexStyle

Устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора.

void SetIndexStyle(
int index, // номер линии
int type, // тип
int style=EMPTY, // стиль линии
int width=EMPTY, // ширина линии
color clr=clrNONE // цвет
);

Параметры

index

[in] Порядковый номер линии. Должен быть от 0 до 7.

type

[in] Стиль отрисовки линии индикатора. Может быть одним из перечисленных стилей отрисовки линии.

style=EMPTY

[in] Стиль линии. Используется для линий толщиной в 1 пиксель. Может быть одним из перечисленных стилей линии. Пустое значение (EMPTY) указывает, что стиль не будет изменен.

width=EMPTY

[in] Ширина линии. Допустимые значения - 1,2,3,4,5. Пустое значение (EMPTY) указывает, что ширина не будет изменена.

clr=clrNONE

[in] Цвет линии. Отсутствие параметра означает, что цвет не будет изменен.

Возвращаемое значение

Нет.

Пример:

SetIndexStyle(3,DRAW_LINE,EMPTY,2,clrRed);

Смотри также

Свойства пользовательских индикаторов


SetLevelStyle

Справочник MQL4 / Пользовательские индикаторы / SetLevelStyle

SetLevelStyle

Устанавливает новый стиль, ширину и цвет для горизонтальных уровней индикатора, выводимого в отдельное окно.

void SetLevelStyle(
int draw_style, // стиль линии
int line_width, // ширина
color clr // цвет
);

Параметры

draw_style

[in] Стиль линии. Может быть одним из перечисленных стилей линии. Пустое значение (EMPTY) указывает, что стиль не будет изменен.

line_width

[in] Ширина линии. Допустимые значения - 1,2,3,4,5. Пустое значение (EMPTY) указывает, что ширина не будет изменена.

clr

[in] Цвет линии. Пустое значение CLR_NONE указывает, что цвет не будет изменен.

Возвращаемое значение

Нет.

Пример:

//--- уровни в виде толстой красной линии
SetLevelStyle(STYLE_SOLID,2,clrRed);

Смотри также

Свойства пользовательских индикаторов


SetLevelValue

Справочник MQL4 / Пользовательские индикаторы / SetLevelValue

SetLevelValue

Устанавливает значение указанного горизонтального уровня индикатора, выводимого в отдельное окно.

void SetLevelValue(
int level, // номер уровня
double value // значение
);

Параметры

level

[in] Номер уровня (0-31).

value

[in] Значение для указанного уровня.

Возвращаемое значение

Нет.

Пример:

SetLevelValue(1,3.14);

Смотри также

Свойства пользовательских индикаторов


Графические объекты

Справочник MQL4 / Графические объекты

Графические объекты

Группа функций, предназначенных для работы с графическими объектами, относящимися к любому указанному графику. При этом для объектов собственного графика используется прямой доступ, то есть при вызове функции предварительно проверяется существование указанного объекта и сразу же выводится код ошибки в случае неудачи. При использовании функций для объектов чужого графика вызов является асинхронным – то есть никакие предварительные проверки не производятся и команда отправляется в очередь указанного графика как есть.

Функции, задающие свойства графических объектов, а также операции создания ObjectCreate() и перемещения ObjectMove() объектов на графике фактически служат для отправки команд графику. При успешном выполнении этих функций команда попадает в общую очередь событий графика. Визуальное изменение свойств графических объектов производится в процессе обработки очереди событий данного графика.

По этой причине не следует ожидать немедленного визуального обновления графических объектов после вызова данных функций. В общем случае обновление графических объектов на чарте производится терминалом автоматически по событиям изменения - поступление новой котировки, изменения размера окна графика и т.д. Для принудительного обновления графических объектов используйте команду на перерисовку графика ChartRedraw().

Функция | Действие
ObjectCreate | Создает объект заданного типа в указанном подокне графика
ObjectName | Возвращает имя объекта по порядковому номеру в списке объектов
ObjectDelete | Удаляет объект с указанным именем
ObjectsDeleteAll | Удаляет все объекты с указанным типом и в указанном подокне графика
ObjectFind | Ищет по имени объект с указанным именем
ObjectGetTimeByValue | Возвращает значение времени для указанного значения цены объекта
ObjectGetValueByTime | Возвращает ценовое значение объекта для указанного времени
ObjectMove | Изменяет координаты указанной точки привязки объекта
ObjectsTotal | Возвращает общее число объектов указанного типа на графике
ObjectGetDouble | Возвращает значение типа double соответствующего свойства объекта
ObjectGetInteger | Возвращает целочисленное значение соответствующего свойства объекта
ObjectGetString | Возвращает значение типа string соответствующего свойства объекта
ObjectSetDouble | Устанавливает значение соответствующего свойства объекта
ObjectSetInteger | Устанавливает значение соответствующего свойства объекта
ObjectSetString | Устанавливает значение соответствующего свойства объекта
TextSetFont | Устанавливает шрифт для вывода текста методами рисования (по умолчанию используется шрифт Arial 20)
TextOut | Выводит текст в пользовательский массив (буфер), предназначенный для создания графического ресурса
TextGetSize | Возвращает ширину и высоту строки при текущих настройках шрифта
ObjectDescription | Возвращает описание объекта
ObjectGet | Возвращает значение указанного свойства объекта
ObjectGetFiboDescription | Возвращает описание уровня объекта Фибоначчи
ObjectGetShiftByValue | Вычисляет и возвращает номер бара (смещение относительно текущего бара) для указанной цены
ObjectGetValueByShift | Вычисляет и возвращает значение цены для указанного бара (смещение относительно текущего бара)
ObjectSet | Изменяет значение указанного свойства объекта
ObjectSetFiboDescription | Устанавливает новое описание уровня объекта Фибоначчи
ObjectSetText | Изменяет описание объекта
ObjectType | Возвращает тип указанного объекта

Каждый графический объект должен иметь имя, уникальное в пределах одного графика, включая его подокна. Изменение имени графического объекта формирует два события: первое - это событие удаления объекта со старым именем, и второе – событие создания графического объекта с новым именем.

После создания объекта или модификации свойств объекта рекомендуется вызывать функцию ChartRedraw(), которая отдает терминалу команду на принудительную отрисовку графика (и всех видимых на нем объектов).

Что нового в MQL5

В MQL5 стало больше графических объектов и самым необычным из них является OBJ_CHART(График) – вы можете вставлять такие объекты как графики символов. Добавьте вместе с OBJ_CHART также индикаторы и панели управления с обработкой пользовательских событий – и обычный график превратится в удобный инструмент анализа с возможностью быстрой смены символов и таймфреймов одним кликом мышки.

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


ObjectCreate

Справочник MQL4 / Графические объекты / ObjectCreate

ObjectCreate

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

bool ObjectCreate(
long chart_id, // идентификатор графика
string object_name, // имя объекта
ENUM_OBJECT object_type, // тип объекта
int sub_window, // индекс окна
datetime time1, // время первой точки привязки
double price1, // цена первой точки привязки
...
datetime timeN=0, // время N-точки привязки
double priceN=0 // цена N-точки привязки
);

Создает объект с указанным именем, типом и начальными координатами в указанном подокне текущего графика:

bool ObjectCreate(
string object_name, // имя объекта
ENUM_OBJECT object_type, // тип объекта
int sub_window, // индекс окна
datetime time1, // время первой точки привязки
double price1, // цена первой точки привязки
datetime time2=0, // время второй точки привязки
double price2=0, // цена второй точки привязки
datetime time3=0, // время третьей точки привязки
double price3=0 // цена третьей точки привязки
);

Параметры

chart_id

[in] Идентификатор графика.

object_name

[in] Уникальное имя объекта.

object_type

[in] Тип объекта. Может быть любым из типов объектов.

sub_window

[in] Индекс окна, в которое будет добавлен объект. Окно должно существовать (индекс окна должен быть большим или равным 0 и меньшим, чем WindowsTotal()), иначе функция возвратит false.

time1

[in] Временная координата первой точки привязки.

price1

[in] Ценовая координата первой точки привязки.

time2=0

[in] Временная координата второй точки привязки.

price2=0

[in] Ценовая координата второй точки привязки.

time3=0

[in] Временная координата третьей точки привязки.

price3=0

[in] Ценовая координата третьей точки привязки.

timeN=0

[in] Временная координата N-й точки привязки.

priceN=0

[in] Ценовая координата N-й точки привязки.

Возвращаемое значение

При использовании функции на собственном графике осуществляется прямой доступ к графику (как это всегда было в MQL4) и возврат true означает успешное создание объекта, иначе false. В этом случае для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Для создания объектов на чужом графике используется асинхронный вызов, поэтому ObjectCreate() возвращает только результат постановки команды в очередь графика. В этом случае true означает только то, что команда на создание объекта успешно поставлена в очередь, сам результат её выполнения неизвестен. Для проверки результата выполнения можно использовать функцию ObjectFind или любые функции, запрашивающие свойства объекта, например вида ObjectGetXXX. Но при этом следует иметь в виду, что такие функции ставятся в конец очереди команд чужого графика и дожидаются результата выполнения (так как являются синхронными вызовами), то есть могут быть затратными по времени.

Примечание

Число координат, связываемых с объектом, может быть от 1 до 3 в зависимости от типа. Объекты с типом OBJ_LABEL игнорируют координаты. Используйте функцию ObjectSet() для установки свойств OBJPROP_XDISTANCE и OBJPROP_YDISTANCE. Нумерация подокон графика (если на графике есть подокна с индикаторами) начинается с 1. Главное окно графика есть всегда и имеет индекс 0. Координаты должны передаваться парами - время и цена. Для примера, объекту OBJ_VLINE требуется только время, но также нужно передать и цену (любое значение).

Имя графического объекта не должно превышать 63 символа. Не допускаются символы вне текущей кодовой страницы (символы, которые не могут быть переведены из Unicode в ANSI, заменяются на символ '?'). Если предполагается распространение программ среди пользователей, имеющих различные кодовые страницы, настоятельно рекомендуется использование латинских символов в именах объектов.

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
int start()
{
int i;
string obj_name="label_object";
long current_chart_id=ChartID();
//--- создаем объект типа label
if(!ObjectCreate(current_chart_id,obj_name,OBJ_LABEL,0,0,0))
{
Print("Ошибка создания объекта: code #",GetLastError());
return(0);
}
//--- устанавливаем цвет Red
ObjectSetInteger(current_chart_id,obj_name,OBJPROP_COLOR,clrRed);
//--- перемещение объекта label и изменение его текста
for(i=0; i<200; i++)
{
//-- устанавливаем текст объекта
ObjectSetString(current_chart_id,obj_name,OBJPROP_TEXT,StringFormat("Simple Label at y= %d",i));
//-- устанавливаем значение координаты Y
ObjectSet(obj_name,OBJPROP_YDISTANCE,i);
//-- перерисовка графика
ChartRedraw(current_chart_id);
Sleep(10);
}
//--- устанавливаем цвет Blue
ObjectSetInteger(current_chart_id,obj_name,OBJPROP_COLOR,clrBlue);
//--- move object up and change its text
for(i=200; i>0; i--)
{
//-- устанавливаем текст объекта
ObjectSetString(current_chart_id,obj_name,OBJPROP_TEXT,StringFormat("Simple Label at y= %d",i));
//-- устанавливаем значение координаты Y
ObjectSet(obj_name,OBJPROP_YDISTANCE,i);
//-- перерисовка графика
ChartRedraw(current_chart_id);
Sleep(10);
}
//--- удаление объекта
ObjectDelete(obj_name);
return(0);
}

Смотри также

Типы объектов


ObjectName

Справочник MQL4 / Графические объекты / ObjectName

ObjectName

Возвращает имя объекта по порядковому номеру в списке объектов.

string ObjectName(
int object_index // номер в списке объектов
);

Параметры

object_index

[in] Порядковый номер в списке объектов. Должен быть большим или равным 0 и меньшим, чем ObjectsTotal().

Возвращаемое значение

Имя объекта в случае удачи. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int i;
long current_chart_id=ChartID();
//--- создаем несколько объектов типа label
for(i=0; i<300; i+=10)
{
string obj_name="label_object"+IntegerToString(i);
//--- создаем объект
if(ObjectCreate(obj_name,OBJ_LABEL,0,0,0))
{
PrintFormat("Object %s created.",obj_name);
//--- устанавливаем цвет
ObjectSetInteger(current_chart_id,obj_name,OBJPROP_COLOR,MathRand());
//--- устанавливаем текст
ObjectSetString(current_chart_id,obj_name,OBJPROP_TEXT,StringFormat("Simple Label at y= %d",i));
//-- устанавливаем координаты
ObjectSet(obj_name,OBJPROP_XDISTANCE,i);
ObjectSet(obj_name,OBJPROP_YDISTANCE,i);
//-- перерисовываем график
ChartRedraw(current_chart_id);
Sleep(10);
}
else
{
Print("Ошибка создания объекта: код ошибки #",GetLastError());
}
}
//--- пауза в 3 секунды
Sleep(3000);
//--- показываем список объектов
int obj_total=ObjectsTotal();
PrintFormat("Всего %d объектов",obj_total);
string name;
for(i=0;i<obj_total;i++)
{
name=ObjectName(i);
PrintFormat("Объект %d: Имя объекта - %s",i,name);
}
//--- удаляем все объекты
ObjectsDeleteAll();
}


ObjectDelete

Справочник MQL4 / Графические объекты / ObjectDelete

ObjectDelete

Удаляет объект с указанным именем на указанном графике. Существует два варианта функции:

bool ObjectDelete(
long chart_id, // идентификатор графика
string object_name // имя объекта
);

Удаляет объект с указанным именем:

bool ObjectDelete(
string object_name // имя объекта
);

Параметры

chart_id

[in] Идентификатор графика.

object_name

[in] Имя удаляемого объекта.

Возвращаемое значение

Возвращает true при успешном завершении операции удаления, в противном случае возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

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

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

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

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
int start()
{
int i;
long current_chart_id=ChartID();
//--- создаем несколько объектов типа label
for(i=0; i<300; i+=10)
{
string obj_name="label_object"+IntegerToString(i);
//--- создаем объект
if(ObjectCreate(obj_name,OBJ_LABEL,0,0,0))
{
PrintFormat("Object %s created.",obj_name);
//--- устанавливаем цвет
ObjectSetInteger(current_chart_id,obj_name,OBJPROP_COLOR,MathRand());
//--- устанавливаем текст
ObjectSetString(current_chart_id,obj_name,OBJPROP_TEXT,StringFormat("Simple Label at y= %d",i));
//-- устанавливаем координаты
ObjectSet(obj_name,OBJPROP_XDISTANCE,i);
ObjectSet(obj_name,OBJPROP_YDISTANCE,i);
//-- перерисовываем график
ChartRedraw(current_chart_id);
Sleep(10);
}
else
{
Print("Ошибка создания объекта: код ошибки #",GetLastError());
return(0);
}
}
//--- пауза в 3 секунды
Sleep(3000);
//--- удаление всех созданных объектов
int obj_total=ObjectsTotal();
PrintFormat("Всего %d объектов",obj_total);
for(i=obj_total-1;i>=0;i--)
{
string name=ObjectName(i);
PrintFormat("Объект %d: %s",i,name);
ObjectDelete(name);
}
return(0);
}


ObjectsDeleteAll

Справочник MQL4 / Графические объекты / ObjectsDeleteAll

ObjectsDeleteAll

Удаляет все объекты с указанным типом и в указанном подокне графика.

int ObjectsDeleteAll(
long chart_id, // идентификатор графика
int sub_window=EMPTY, // индекс окна
int object_type=EMPTY // тип объекта для удаления
);

Удаляет все объекты с указанным типом:

int ObjectsDeleteAll(
int sub_window=EMPTY, // индекс окна
int object_type=EMPTY // тип объекта для удаления
);

Удаляет по префиксу имени в подокне графика все объекты указанного типа.

int ObjectsDeleteAll(
long chart_id, // идентификатор графика
const string prefix, // префикс имени объекта
int sub_window=EMPTY, // индекс окна
int object_type=EMPTY // тип объекта для удаления
);

Параметры

chart_id

[in] Идентификатор графика.

prefix

[in] Префикс, по которому будут удалены все объекты, чьи имена начинаются с данного набора символов. Префикс можно указывать как 'name' или 'name*' – оба варианта работают одинаково. Если в качестве префикса указана пустая строка, то будут удалены объекты с любым именем.

sub_window=EMPTY

[in] Необязательный параметр. Индекс окна, на котором будут удалены объекты. Должен быть большим или равным -1 (EMPTY, значение по умолчанию) и меньшим, чем WindowsTotal().

object_type=EMPTY

[in] Необязательный параметр. Тип объекта для удаления. Это может быть любое из значений списка идентификаторов типов объектов или EMPTY (-1) для удаления всех объектов.

Возвращаемое значение

Возвращает количество удаленных объектов. Для получения дополнительной информации об ошибке необходимо вызвать функцию функцию GetLastError().

Примечание

Замечания: нумерация подокон графика (если на графике есть подокна с индикаторами) начинается с 1. Главное окно графика есть всегда и имеет индекс 0. Если индекс окна отсутствует или имеет значение -1, то объекты удаляются со всего графика. Если значение параметра type равно -1 или этот параметр отсутствует, то удаляются все объекты из указанного подокна.

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

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

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

Пример:

ObjectsDeleteAll(2, OBJ_HLINE); // удаляются все горизонтальные линии из 2-го подокна.
ObjectsDeleteAll(2); // удаляются все объекты из 2-го подокна.
ObjectsDeleteAll(); // удаляются все объекты с графика.


ObjectFind

Справочник MQL4 / Графические объекты / ObjectFind

ObjectFind

Ищет объект с указанным именем. Существует два варианта функции:

int ObjectFind(
long chart_id, // идентификатор графика
string object_name // имя объекта
);

Ищет объект с указанным именем:

int ObjectFind(
string object_name // имя объекта
);

Параметры

chart_id

[in] Идентификатор графика.

object_name

[in] Имя искомого объекта.

Возвращаемое значение

Функция возвращает индекс окна, которому принадлежит искомый объект. В случае неудачи функция вернет -1. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Нумерация подокон графика (если на графике есть подокна с индикаторами) начинается с 1. Главное окно графика есть всегда и имеет индекс 0.

При использовании варианта функции без указания идентификатора графика подразумевается работа с собственным графиком и осуществляется прямой доступ к нему.

Если же при вызове указывается идентификатор графика, то для поиска объекта на чужом графике всегда используется синхронный вызов. Синхронный вызов означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду, если ведется работа с большим количеством объектов на графике.

Пример:

if(ObjectFind(0,"line_object2")!=win_idx) return(0);


ObjectGetTimeByValue

Справочник MQL4 / Графические объекты / ObjectGetTimeByValue

ObjectGetTimeByValue

Возвращает значение времени для указанного значения цены указанного объекта.

datetime ObjectGetTimeByValue(
long chart_id, // идентификатор графика
string object_name, // имя объекта
double value, // цена
int line_id=0 // номер линии
);

Параметры

chart_id

[in] Идентификатор графика.

object_name

[in] Имя объекта.

value

[in] Значение цены.

line_id=0

[in] Идентификатор линии.

Возвращаемое значение

Значение времени для указанного значения цены указанного объекта.

Примечание

При использовании функции на собственном графике осуществляется прямой доступ к графику, в то время как для получения свойств объекта с чужого графика всегда используется синхронный вызов. Синхронный вызов означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду, если ведется работа с большим количеством объектов на графике.

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

  • Трендовая линия (OBJ_TREND)
  • Трендовая линия по углу (OBJ_TRENDBYANGLE)
  • Линия Ганна (OBJ_GANNLINE)
  • Равноудаленный канал (OBJ_CHANNEL) - 2 линии
  • Канал на линейной регрессии (OBJ_REGRESSION) - 3 линии
  • Канал стандартного отклонения (OBJ_STDDEVCHANNEL) - 3 линии

Смотри также

Типы объектов


ObjectGetValueByTime

Справочник MQL4 / Графические объекты / ObjectGetValueByTime

ObjectGetValueByTime

Возвращает значение цены для указанного времени указанного объекта.

double ObjectGetValueByTime(
long chart_id, // идентификатор графика
string object_name, // имя объекта
datetime time, // время
int line_id=0 // номер линии
);

Параметры

chart_id

[in] Идентификатор графика.

object_name

[in] Имя объекта.

time

[in] Значение времени.

line_id=0

[in] Идентификатор линии.

Возвращаемое значение

Значение цены для указанного времени указанного объекта.

Примечание

При использовании функции на собственном графике осуществляется прямой доступ к графику, в то время как для получения свойств объекта с чужого графика всегда используется синхронный вызов. Синхронный вызов означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду, если ведется работа с большим количеством объектов на графике.

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

  • Трендовая линия (OBJ_TREND)
  • Трендовая линия по углу (OBJ_TRENDBYANGLE)
  • Линия Ганна (OBJ_GANNLINE)
  • Равноудаленный канал (OBJ_CHANNEL) - 2 линии
  • Канал на линейной регрессии (OBJ_REGRESSION) - 3 линии
  • Канал стандартного отклонения (OBJ_STDDEVCHANNEL) - 3 линии

Смотри также

Типы объектов


ObjectMove

Справочник MQL4 / Графические объекты / ObjectMove

ObjectMove

Изменяет координаты указанной точки привязки объекта на указанном графике. Существует два варианта функции:

bool ObjectMove(
long chart_id, // идентификатор графика
string object_name, // имя объекта
int point_index, // номер привязки
datetime time, // время
double price // цена
);

Изменение координат указанной точки привязки объекта:

bool ObjectMove(
string object_name, // имя объекта
int point_index, // номер привязки
datetime time, // время
double price // цена
);

Параметры

chart_id

[in] Идентификатор графика.

object_name

[in] Имя объекта.

point_index

[in] Номер точки привязки. Количество точек привязки зависит от типа объекта (0-2).

time

[in] Временная координата указанной точки привязки.

price

[in] Ценовая координата указанной точки привязки.

Возвращаемое значение

В случае успеха возвращает true, при неудаче возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Нумерация координат объекта начинается с 0. Объекты могут иметь от одной до трех точек привязки в зависимости от типа объекта.

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

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

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

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
int start()
{
string obj_name="trend_line";
long current_chart_id=ChartID();
//---
datetime t1=Time[0];
double p1=Close[0];
//---
datetime t2=Time[1];
double p2=Close[1];
//--- создаем объект trend line
if(!ObjectCreate(obj_name,OBJ_TREND,0,t1,p1,t2,p2))
{
Print("Ошибка создания объекта trend line! Код #",GetLastError());
return(0);
}
//--- устанавливаем цвет линии
ObjectSetInteger(current_chart_id,obj_name,OBJPROP_COLOR,clrRed);
//--- передвижение трендовой линии
for(int i=1; i<200; i++)
{
t2=Time[i];
p2=Close[i];
//--- передвижение 2-й точки привязки трендовой линии
ObjectMove(obj_name,1,t2,p2);
//--- перерисовка графика
ChartRedraw(current_chart_id);
Sleep(100);
}
//--- пауза 3 секунды
Sleep(3000);
//--- удаление объекта
ObjectDelete(obj_name);
return(0);
}


ObjectsTotal

Справочник MQL4 / Графические объекты / ObjectsTotal

ObjectsTotal

Возвращает общее количество объектов указанного типа в указанном графике. Существует два варианта функции:

int ObjectsTotal(
long chart_id, // идентификатор графика
int sub_window=-1, // индекс окна
int type=-1 // тип объекта
);

Возвращает общее количество объектов указанного типа на графике:

int ObjectsTotal(
int type=EMPTY // тип объекта
);

Параметры

chart_id

[in] Идентификатор графика.

sub_window=-1

[in] Номер подокна графика. 0 означает главное окно графика, -1 означает все подокна графика, включая главное окно.

type=-1

[in] Необязательный параметр. Тип объекта для подсчета количества объектов данного типа. Это может быть любое из значений перечисления ENUM_OBJECT или EMPTY (-1) для подсчета всех объектов.

Возвращаемое значение

Общее количество объектов.

Примечание

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

Пример:

int obj_total=ObjectsTotal();
string name;
for(int i=0;i<obj_total;i++)
{
name = ObjectName(i);
Print(i," - объект ",name);
}


ObjectGetDouble

Справочник MQL4 / Графические объекты / ObjectGetDouble

ObjectGetDouble

Возвращает значение соответствующего свойства объекта. Свойство объекта должно быть типа double. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

double ObjectGetDouble(
long chart_id, // идентификатор графика
string object_name, // имя объекта
int prop_id, // идентификатор свойства
int prop_modifier=0 // модификатор свойства, если требуется
);

2. Возвращает true или false в зависимости от успешности выполнения функции. В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool ObjectGetDouble(
long chart_id, // идентификатор графика
string object_name, // имя объекта
int prop_id, // идентификатор свойства
int prop_modifier, // модификатор свойства
double& double_var // сюда примем значение свойства
);

Параметры

chart_id

[in] Идентификатор графика (0-текущий график).

object_name

[in] Имя объекта.

prop_id

[in] Идентификатор свойства объекта. Значение может быть одним из значений перечисления ENUM_OBJECT_PROPERTY_DOUBLE.

prop_modifier

[in] Модификатор указанного свойства. Для первого варианта по умолчанию значение модификатора равно 0. Большинство свойств не требуют модификатора. Означает номер уровня в инструментах Фибоначчи и в графическом объекте Вилы Эндрюса. Нумерация уровней начинается с нуля.

double_var

[out] Переменная типа double, принимающая значение запрашиваемого свойства.

Возвращаемое значение

Значение типа double для первого варианта вызова.

Для второго варианта вызова возвращает true, если данное свойство поддерживается и значение было помещено в переменную double_var, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

При использовании функции на собственном графике осуществляется прямой доступ к графику, в то время как для получения свойств объекта с чужого графика всегда используется синхронный вызов. Синхронный вызов означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду, если ведется работа с большим количеством объектов на графике.


ObjectGetInteger

Справочник MQL4 / Графические объекты / ObjectGetInteger

ObjectGetInteger

Возвращает значение соответствующего свойства объекта. Свойство объекта должно быть типов datetime, int, color, bool или char. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

long ObjectGetInteger(
long chart_id, // идентификатор графика
string object_name, // имя объекта
int prop_id, // идентификатор свойства
int prop_modifier=0 // модификатор свойства, если требуется
);

2. Возвращает true или false в зависимости от успешности выполнения функции. В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool ObjectGetInteger(
long chart_id, // идентификатор графика
string object_name, // имя объекта
int prop_id, // идентификатор свойства
int prop_modifier, // модификатор свойства
long& long_var // сюда примем значение свойства
);

Параметры

chart_id

[in] Идентификатор графика (0-текущий график).

object_name

[in] Имя объекта.

prop_id

[in] Идентификатор свойства объекта. Значение может быть одним из значений перечисления ENUM_OBJECT_PROPERTY_INTEGER.

prop_modifier

[in] Модификатор указанного свойства. Для первого варианта по умолчанию значение модификатора равно 0. Большинство свойств не требуют модификатора. Означает номер уровня в инструментах Фибоначчи и в графическом объекте Вилы Эндрюса. Нумерация уровней начинается с нуля.

long_var

[out] Переменная типа long, принимающая значение запрашиваемого свойства.

Возвращаемое значение

Значение типа long для первого варианта вызова.

Для второго варианта вызова возвращает true, если данное свойство поддерживается и значение было помещено в переменную long_var, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

При использовании функции на собственном графике осуществляется прямой доступ к графику, в то время как для получения свойств объекта с чужого графика всегда используется синхронный вызов. Синхронный вызов означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду, если ведется работа с большим количеством объектов на графике.


ObjectGetString

Справочник MQL4 / Графические объекты / ObjectGetString

ObjectGetString

Возвращает значение соответствующего свойства объекта. Свойство объекта должно быть типа string. Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

string ObjectGetString(
long chart_id, // идентификатор графика
string object_name, // имя объекта
int prop_id, // идентификатор свойства
int prop_modifier=0 // модификатор свойства, если требуется
);

2. Возвращает true или false в зависимости от успешности выполнения функции. В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool ObjectGetString(
long chart_id, // идентификатор графика
string object_ame, // имя объекта
int prop_id, // идентификатор свойства
int prop_modifier, // модификатор свойства
string& string_var // сюда примем значение свойства
);

Параметры

chart_id

[in] Идентификатор графика (0-текущий график).

object_name

[in] Имя объекта.

prop_id

[in] Идентификатор свойства объекта. Значение может быть одним из значений перечисления ENUM_OBJECT_PROPERTY_STRING.

prop_modifier

[in] Модификатор указанного свойства. Для первого варианта по умолчанию значение модификатора равно 0. Большинство свойств не требуют модификатора. Означает номер уровня в инструментах Фибоначчи и в графическом объекте Вилы Эндрюса. Нумерация уровней начинается с нуля.

string_var

[out] Переменная типа string, принимающая значение запрашиваемого свойства.

Возвращаемое значение

Значение типа string для первого варианта вызова.

Для второго варианта вызова возвращает true, если данное свойство поддерживается и значение было помещено в переменную string_var, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

При использовании функции на собственном графике осуществляется прямой доступ к графику, в то время как для получения свойств объекта с чужого графика всегда используется синхронный вызов. Синхронный вызов означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду, если ведется работа с большим количеством объектов на графике.


ObjectSetDouble

Справочник MQL4 / Графические объекты / ObjectSetDouble

ObjectSetDouble

Задает значение соответствующего свойства объекта. Свойство объекта должно быть типа double. Существует 2 варианта функции.

Установка значения свойства, не имеющего модификатора

bool ObjectSetDouble(
long chart_id, // идентификатор графика
string object_name, // имя
int prop_id, // свойство
double prop_value // значение
);

Установка значения свойства с указанием модификатора

bool ObjectSetDouble(
long chart_id, // идентификатор графика
string object_name, // имя
int prop_id, // свойство
int prop_modifier, // модификатор
double prop_value // значение
);

Параметры

chart_id

[in] Идентификатор графика (0-текущий график).

object_name

[in] Имя объекта.

prop_id

[in] Идентификатор свойства объекта. Значение может быть одним из значений перечисления ENUM_OBJECT_PROPERTY_DOUBLE.

prop_modifier

[in] Модификатор указанного свойства. Означает номер уровня в инструментах Фибоначчи и в графическом объекте Вилы Эндрюса. Нумерация уровней начинается с нуля.

prop_value

[in] Значение свойства.

Возвращаемое значение

Возвращает true только в том случае, если команда на изменение свойств графического объекта успешно отправлена графику, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

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

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

Пример создания Фибо-объекта и добавления нового уровня в нем

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- вспомогательные массивы
double high[],low[],price1,price2;
datetime time[],time1,time2;
//--- скопируем цены открытия - 100 последних баров хватит
int copied=CopyHigh(Symbol(),0,0,100,high);
if(copied<=0)
{
Print("Не удалось скопировать значения ценовой серии High");
return;
}
//--- скопируем цены закрытия - 100 последних баров хватит
copied=CopyLow(Symbol(),0,0,100,low);
if(copied<=0)
{
Print("Не удалось скопировать значения ценовой серии Low");
return;
}
//--- скопируем время открытия для 100 последних баров
copied=CopyTime(Symbol(),0,0,100,time);
if(copied<=0)
{
Print("Не удалось скопировать значения ценовой серии Time");
return;
}
//--- организуем доступ к скопированным данным как к таймсериям - задом наперед
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(time,true);

//--- координаты первой точки привязки Фибо-объекта
price1=high[70];
time1=time[70];
//--- координаты первой точки привязки Фибо-объекта
price2=low[50];
time2=time[50];

//--- пора создать и сам Фибо-объект
bool created=ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);
if(created) // если объект создан удачно
{
//--- установим цвет Фибо0уровней
ObjectSetInteger(0,"Fibo",OBJPROP_LEVELCOLOR,Blue);
//--- кстати, а сколько у нас Фибо-уровней ?
int levels=ObjectGetInteger(0,"Fibo",OBJPROP_LEVELS);
Print("Fibo levels before = ",levels);
//---выведем в Журнал=> номер уровня:значения описание_уровня
for(int i=0;i<levels;i++)
{
Print(i,":",ObjectGetDouble(0,"Fibo",OBJPROP_LEVELVALUE,i),
" ",ObjectGetString(0,"Fibo",OBJPROP_LEVELTEXT,i));
}
//--- попробуем увеличить количество уровней на единицу
bool modified=ObjectSetInteger(0,"Fibo",OBJPROP_LEVELS,levels+1);
if(!modified) // не удалось количество уровней изменить
{
Print("Не удалось изменить количество уровней в Фибо, ошибка ",GetLastError());
}
//--- просто сообщим
Print("Fibo levels after = ",ObjectGetInteger(0,"Fibo",OBJPROP_LEVELS));
//--- зададим значение для вновь созданного уровня
bool added=ObjectSetDouble(0,"Fibo",OBJPROP_LEVELVALUE,levels,133);
if(added) // удалось задать значение для уровня
{
Print("Удалось установить еще один уровень Fibo");
//--- также не забыть задать описание уровня
ObjectSetString(0,"Fibo",OBJPROP_LEVELTEXT,levels,"my level");
ChartRedraw(0);
//--- получим актуальное значения количества уровней в Фибо-объекте
levels=ObjectGetInteger(0,"Fibo",OBJPROP_LEVELS);
Print("Fibo levels after adding = ",levels);
//--- еще раз выведем все уровни - просто чтобы убедиться
for(int i=0;i<levels;i++)
{
Print(i,":",ObjectGetDouble(0,"Fibo",OBJPROP_LEVELVALUE,i),
" ",ObjectGetString(0,"Fibo",OBJPROP_LEVELTEXT,i));
}

}
else // неудача при попытке увеличить количество уровней в Фибо-объекте
{
Print("Не удалось установить ещеь один уровень Fibo. Ошибка ",GetLastError());
}
}
}

Смотри также

Типы объектов, Свойства объектов


ObjectSetInteger

Справочник MQL4 / Графические объекты / ObjectSetInteger

ObjectSetInteger

Задает значение соответствующего свойства объекта. Свойство объекта должно быть типов datetime, int, color, bool или char. Существует 2 варианта функции.

Установка значения свойства, не имеющего модификатора

bool ObjectSetInteger(
long chart_id, // идентификатор графика
string object_name, // имя
int prop_id, // свойство
long prop_value // значение
);

Установка значения свойства с указанием модификатора

bool ObjectSetInteger(
long chart_id, // идентификатор графика
string object_name, // имя
int prop_id, // свойство
int prop_modifier, // модификатор
long prop_value // значение
);

Параметры

chart_id

[in] Идентификатор графика (0-текущий график).

object_name

[in] Имя объекта.

prop_id

[in] Идентификатор свойства объекта. Значение может быть одним из значений перечисления ENUM_OBJECT_PROPERTY_INTEGER.

prop_modifier

[in] Модификатор указанного свойства. Означает номер уровня в инструментах Фибоначчи и в графическом объекте Вилы Эндрюса. Нумерация уровней начинается с нуля.

prop_value

[in] Значение свойства.

Возвращаемое значение

Возвращает true только в том случае, если команда на изменение свойств графического объекта успешно отправлена графику, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

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

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

Пример создания таблицы Web-цветов

//+------------------------------------------------------------------+
//| Table of Web Colors|
//| Copyright 2011, MetaQuotes Software Corp |
//| https://www.metaquotes.net |
//+------------------------------------------------------------------+
#define X_SIZE 140 // ширина объекта OBJ_EDIT
#define Y_SIZE 33 // ширина объекта OBJ_EDIT
//+------------------------------------------------------------------+
//| Массив Web-цветов
//+------------------------------------------------------------------+
color ExtClr[140]=
{
clrAliceBlue,clrAntiqueWhite,clrAqua,clrAquamarine,clrAzure,clrBeige,clrBisque,clrBlack,clrBlanchedAlmond,
clrBlue,clrBlueViolet,clrBrown,clrBurlyWood,clrCadetBlue,clrChartreuse,clrChocolate,clrCoral,clrCornflowerBlue,
clrCornsilk,clrCrimson,clrCyan,clrDarkBlue,clrDarkCyan,clrDarkGoldenrod,clrDarkGray,clrDarkGreen,clrDarkKhaki,
clrDarkMagenta,clrDarkOliveGreen,clrDarkOrange,clrDarkOrchid,clrDarkRed,clrDarkSalmon,clrDarkSeaGreen,
clrDarkSlateBlue,clrDarkSlateGray,clrDarkTurquoise,clrDarkViolet,clrDeepPink,clrDeepSkyBlue,clrDimGray,
clrDodgerBlue,clrFireBrick,clrFloralWhite,clrForestGreen,clrFuchsia,clrGainsboro,clrGhostWhite,clrGold,
clrGoldenrod,clrGray,clrGreen,clrGreenYellow,clrHoneydew,clrHotPink,clrIndianRed,clrIndigo,clrIvory,clrKhaki,
clrLavender,clrLavenderBlush,clrLawnGreen,clrLemonChiffon,clrLightBlue,clrLightCoral,clrLightCyan,
clrLightGoldenrod,clrLightGreen,clrLightGray,clrLightPink,clrLightSalmon,clrLightSeaGreen,clrLightSkyBlue,
clrLightSlateGray,clrLightSteelBlue,clrLightYellow,clrLime,clrLimeGreen,clrLinen,clrMagenta,clrMaroon,
clrMediumAquamarine,clrMediumBlue,clrMediumOrchid,clrMediumPurple,clrMediumSeaGreen,clrMediumSlateBlue,
clrMediumSpringGreen,clrMediumTurquoise,clrMediumVioletRed,clrMidnightBlue,clrMintCream,clrMistyRose,clrMoccasin,
clrNavajoWhite,clrNavy,clrOldLace,clrOlive,clrOliveDrab,clrOrange,clrOrangeRed,clrOrchid,clrPaleGoldenrod,
clrPaleGreen,clrPaleTurquoise,clrPaleVioletRed,clrPapayaWhip,clrPeachPuff,clrPeru,clrPink,clrPlum,clrPowderBlue,
clrPurple,clrRed,clrRosyBrown,clrRoyalBlue,clrSaddleBrown,clrSalmon,clrSandyBrown,clrSeaGreen,clrSeashell,
clrSienna,clrSilver,clrSkyBlue,clrSlateBlue,clrSlateGray,clrSnow,clrSpringGreen,clrSteelBlue,clrTan,clrTeal,
clrThistle,clrTomato,clrTurquoise,clrViolet,clrWheat,clrWhite,clrWhiteSmoke,clrYellow,clrYellowGreen
};
//+------------------------------------------------------------------+
//| Создание и инициализация объекта OBJ_EDIT |
//+------------------------------------------------------------------+
void CreateColorBox(int x,int y,color c)
{
//--- сгенерируем по имени цвета имя для нового объекта
string name="ColorBox_"+(string)x+"_"+(string)y;
//--- создадим новый объект OBJ_EDIT
if(!ObjectCreate(0,name,OBJ_EDIT,0,0,0))
{
Print("Не удалось создать объект: '",name,"'");
return;
}
//--- зададим координаты точки привязки, ширину и высоту в пикселях
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x*X_SIZE);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y*Y_SIZE);
ObjectSetInteger(0,name,OBJPROP_XSIZE,X_SIZE);
ObjectSetInteger(0,name,OBJPROP_YSIZE,Y_SIZE);
//--- установим цвет текста для объекта
if(clrBlack==c) ObjectSetInteger(0,name,OBJPROP_COLOR,clrWhite);
else ObjectSetInteger(0,name,OBJPROP_COLOR,clrBlack);
//--- установим цвет фона
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,c);
//--- установим текст объекта OBJ_EDIT соответствующим цвету фона
ObjectSetString(0,name,OBJPROP_TEXT,(string)c);
}
//+------------------------------------------------------------------+
//| Функция запуска скрипта на выполнение |
//+------------------------------------------------------------------+
void OnStart()
{
//--- создадим таблицу из цветовых блоков 7х20
for(uint i=0;i<140;i++)
CreateColorBox(i%7,i/7,ExtClr[i]);
}

Смотри также

Типы объектов, Свойства объектов


ObjectSetString

Справочник MQL4 / Графические объекты / ObjectSetString

ObjectSetString

Задает значение соответствующего свойства объекта. Свойство объекта должно быть типа string. Существует 2 варианта функции.

Установка значения свойства, не имеющего модификатора:

bool ObjectSetString(
long chart_id, // идентификатор графика
string object_name, // имя
int prop_id, // свойство
string prop_value // значение
);

Установка значения свойства с указанием модификатора:

bool ObjectSetString(
long chart_id, // идентификатор графика
string object_name, // имя
int prop_id, // свойство
int prop_modifier, // модификатор
string prop_value // значение
);

Параметры

chart_id

[in] Идентификатор графика (0-текущий график).

object_name

[in] Имя объекта.

prop_id

[in] Идентификатор свойства объекта. Значение может быть одним из значений перечисления ENUM_OBJECT_PROPERTY_STRING.

prop_modifier

[in] Модификатор указанного свойства. Означает номер уровня в инструментах Фибоначчи и в графическом объекте Вилы Эндрюса. Нумерация уровней начинается с нуля.

prop_value

[in] Значение свойства.

Возвращаемое значение

Возвращает true только в том случае, если команда на изменение свойств графического объекта успешно отправлена графику, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

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

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


TextSetFont

Справочник MQL4 / Графические объекты / TextSetFont

TextSetFont

Устанавливает шрифт для вывода текста методами рисования и возвращает результат успешности этой операции. По умолчанию используется шрифт Arial и размер -120 (12 pt).

bool TextSetFont(
const string name, // имя шрифта или путь к файлу шрифта на диске
int size, // размер шрифта
uint flags=0, // комбинация флагов
int orientation=0 // угол наклона текста
);

Параметры

name

[in] Имя шрифта в системе, или имя ресурса, содержащего шрифт, или путь к файлу шрифта на диске.

size

[in] Размер шрифта, который может задаваться положительными и отрицательными значениями. При положительных значениях размер выводимого текста не зависит от настроек размеров шрифтов в операционной системе. При отрицательных значениях значение задается в десятых долях пункта и размер текста будет зависеть от настроек системы ("стандартный масштаб" или "крупный масштаб"). Более подробно о разнице в режимах смотрите в Примечании.

flags=0

[in] Комбинация флагов, описывающих стиль шрифт.

orientation=0

[in] Угол наклона текста по горизонтали к оси X, единица измерения равна 0.1 градуса. То есть orientation=450 означает наклон в 45 градусов.

Возвращаемое значение

Возвращает true в случае успешной установки текущего шрифта, иначе false. Возможные коды ошибок:

  • ERR_INVALID_PARAMETER(4003) - name представляет NULL или "" (пустая строка),
  • ERR_INTERNAL_ERROR(4001) - ошибка операционной системы (например, попытка создания несуществующего шрифта).

Примечание

Если в имени шрифта используется "::", то шрифт загружается из ресурса EX4. Если имя шрифта name указано с расширением, то шрифт загружается из файла, при этом – если путь начинается с "\" или "/", то файл ищется относительно каталога MQL4, иначе ищется относительно пути EX4-файла, вызвавшего функцию TextSetFont().

Размер шрифта задается положительными или отрицательными значениями, знак определяет зависимость размера текста от настроек операционной системы (масштаба шрифта).

  • Если размер задается положительным числом, то при отображении логического шрифта в физический происходит преобразование размера в физические единицы измерения устройства (пиксели) и этот размер соответствует высоте ячеек символов из доступных шрифтов. Не рекомендуется в тех случаях, когда предполагается совместное использование на графике текстов, выведенных функцией TextOut(), и текстов, отображаемых с помощью графического объекта OBJ_LABEL ("Текстовая метка").
  • Если размер задается отрицательным числом, то указанный размер предполагается заданным в десятых долях логического пункта (значение -350 равно 35 логических пунктов) и делится на 10, а затем полученное значение преобразуется в физические единицы измерения устройства (пиксели) и соответствует абсолютному значению высоты символа из доступных шрифтов. Чтобы получить на экране текст такого же размера, как и в объекте OBJ_LABEL, возьмите указанный в свойствах объекта размер шрифта и умножьте на -10.

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

Флаги для задания стиля начертания шрифта

Флаг | Описание
FONT_ITALIC | Курсив
FONT_UNDERLINE | Подчёркивание
FONT_STRIKEOUT | Перечёркивание

Флаги для задания толщины шрифта

Флаг

FW_DONTCARE

FW_THIN

FW_EXTRALIGHT

FW_ULTRALIGHT

FW_LIGHT

FW_NORMAL

FW_REGULAR

FW_MEDIUM

FW_SEMIBOLD

FW_DEMIBOLD

FW_BOLD

FW_EXTRABOLD

FW_ULTRABOLD

FW_HEAVY

FW_BLACK

Смотри также

Ресурсы, ResourceCreate(), ResourceSave(), TextOut()


TextOut

Справочник MQL4 / Графические объекты / TextOut

TextOut

Выводит текст в пользовательский массив (буфер) и возвращает результат успешности этой операции. Данный массив предназначается для создания графического ресурса.

bool TextOut(
const string text, // выводимый текст
int x, // координатa X
int y, // координатa Y
uint anchor, // способ привязки
uint &data[], // буфер для вывод
uint width, // ширина буфера в точках
uint height, // высота буфера в точках
uint color, // цвет текста
ENUM_COLOR_FORMAT color_format // формат цвета для вывода
);

Параметры

text

[in] Выводимый текст, который будет записан в буфер. Осуществляется только однострочный вывод текста.

x

[in] Координатa X точки привязки для выводимого текста.

y

[in] Координатa Y точки привязки для выводимого текста.

anchor

[in] Значение из набора 9 предопределенных способов расположения точки привязки выводимого текста. Задаётся комбинацией двух флагов – флага выравнивания текста по горизонтали и флага выравнивания текста по вертикали. Наименования флагов приведены в Примечании.

data[]

[in] Буфер, в который выводится текст. Данный буфер используется для создания графического ресурса.

width

[in] Ширина буфера в точках (пикселях).

height

[in] Высота буфера в точках (пикселях).

color

[in] Цвет текста.

color_format

[in] Формат цвета, задаётся значением из перечисления ENUM_COLOR_FORMAT.

Возвращаемое значение

Возвращает true в случае успешного выполнения, иначе false.

Примечание

Способ привязки, задаваемый параметром anchor, является комбинацией двух флагов выравнивания текста по вертикали и горизонтали. Флаги выравнивания текста по горизонтали:

  • TA_LEFT – точка привязки на левой стороне ограничивающего прямоугольника
  • TA_CENTER – точка привязки по горизонтали находится в середине ограничивающего прямоугольника
  • TA_RIGHT – точка привязки на правой стороне ограничивающего прямоугольника

Флаги выравнивания текста по вертикали:

  • TA_TOP – точка привязки на верхней стороне ограничивающего прямоугольника
  • TA_VCENTER – точка привязки по вертикали находится в середине ограничивающего прямоугольника
  • TA_BOTTOM – точка привязки на нижней стороне ограничивающего прямоугольника

Возможные комбинации флагов и задаваемые ими способы привязки показаны на рисунке.

9 возможных способов привязки текстовой строки

Пример:

#property strict
//--- ширина и высота канваса (холста, на котором происходит рисование)
#define IMG_WIDTH 200
#define IMG_HEIGHT 200
//--- перед запуском скрипта покажем окно с параметрами
#property script_show_inputs
//--- дадим возможность задавать формат цвета
input ENUM_COLOR_FORMAT clr_format=COLOR_FORMAT_XRGB_NOALPHA;
//--- массив (буфер) для отрисовки
uint ExtImg[IMG_WIDTH*IMG_HEIGHT];
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- создадим объект OBJ_BITMAP_LABEL для рисования
ObjectCreate(0,"CLOCK",OBJ_BITMAP_LABEL,0,0,0);
//--- укажем имя графического ресурса для отрисовки в объекте CLOCK
ObjectSetString(0,"CLOCK",OBJPROP_BMPFILE,"::IMG");

//--- вспомогательные переменные
double a; // угол стрелки
uint nm=2700; // счетчик минут
uint nh=2700*12; // счетчик часов
uint w,h; // переменные для получения размеров текстовых строк
int x,y; // переменные для расчета текущих координат точки привязки текстовых строк

//--- крутим стрелки часов в бесконечном цикле, пока скрипт не остановят
while(!IsStopped())
{
//--- очистка массива буфера рисования часов
ArrayFill(ExtImg,0,IMG_WIDTH*IMG_HEIGHT,0);
//--- установка шрифта для отрисовки цифр на циферблате
TextSetFont("Arial",-200,FW_EXTRABOLD,0);
//--- рисуем циферблат
for(int i=1;i<=12;i++)
{
//--- получим размеры текущего часа на циферблате
TextGetSize(string(i),w,h);
//--- вычислим координаты текущего часа на циферблате
a=-((i*300)%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*80+0.5+w/2);
y=IMG_HEIGHT/2-int(cos(a)*80+0.5+h/2);
//--- вывод этого часа на циферблат в буфер ExtImg[]
TextOut(string(i),x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);
}
//--- теперь установим шрифт для отрисовки минутной стрелки
TextSetFont("Arial",-200,FW_EXTRABOLD,-int(nm%3600));
//--- получим размеры минутной стрелки
TextGetSize("----->",w,h);
//--- вычислим координаты минутной стрелки на циферблате
a=-(nm%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*h/2+0.5);
y=IMG_HEIGHT/2-int(cos(a)*h/2+0.5);
//--- вывод минутной стрелки на циферблат в буфер ExtImg[]
TextOut("----->",x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);

//--- теперь установим шрифт для отрисовки часовой стрелки
TextSetFont("Arial",-200,FW_EXTRABOLD,-int(nh/12%3600));
TextGetSize("==>",w,h);
//--- вычислим координаты часовой стрелки на циферблате
a=-(nh/12%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*h/2+0.5);
y=IMG_HEIGHT/2-int(cos(a)*h/2+0.5);
//--- вывод часовой стрелки на циферблат в буфер ExtImg[]
TextOut("==>",x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);

//--- обновление графического ресурса
ResourceCreate("::IMG",ExtImg,IMG_WIDTH,IMG_HEIGHT,0,0,IMG_WIDTH,clr_format);
//--- принудительное обновление графика
ChartRedraw();

//--- увеличим счетчики часа и минут
nm+=60;
nh+=60;
//--- выдержим небольшую паузу между кадрами
Sleep(10);
}
//--- удалим объект CLOCK при завершении работы скрипта
ObjectDelete(0,"CLOCK");
//---
}

Смотри также

Ресурсы, ResourceCreate(), ResourceSave(), TextGetSize(), TextSetFont()


TextGetSize

Справочник MQL4 / Графические объекты / TextGetSize

TextGetSize

Возвращает ширину и высоту строки при текущих настройках шрифта.

bool TextGetSize(
const string text, // строка текста
uint& width, // ширина буфера в точках
uint& height // высота буфера в точках
);

Параметры

text

[in] Строка для которой получаем длину и ширину.

width

[out] Входной параметр для получения ширины.

height

[out] Входной параметр для получения высоты.

Возвращаемое значение

Возвращает true в случае успешного выполнения, иначе false. Возможные коды ошибок:

  • ERR_INTERNAL_ERROR(4001) - в случае ошибки операционной системы.

Смотри также

Ресурсы, ResourceCreate(), ResourceSave(), TextSetFont(), TextOut()


ObjectDescription

Справочник MQL4 / Графические объекты / ObjectDescription

ObjectDescription

Возвращает описание объекта.

string ObjectDescription(
string object_name // имя объекта
);

Параметры

name

[in] Имя объекта.

Возвращаемое значение

Текстовое описание объекта. Для объектов типа OBJ_TEXT и OBJ_LABEL возвращается текст, отображаемый этими объектами. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

// сохранение списка объектов графика в файл
int handle, total;
string obj_name,fname;
// имя файла
fname="objlist_"+Symbol();
handle=FileOpen(fname,FILE_CSV|FILE_WRITE);
if(handle>0)
{
total=ObjectsTotal();
for(int i=-;i<total;i++)
{
obj_name=ObjectName(i);
FileWrite(handle,"Object "+obj_name+" описание= "+ObjectDescription(obj_name));
}
FileClose(handle);
}

Смотри также

ObjectSetText()


ObjectGet

Справочник MQL4 / Графические объекты / ObjectGet

ObjectGet

Возвращает значение указанного свойства объекта.

double ObjectGet(
string object_name, // имя объекта
int index // идентификатор свойства
);

Параметры

object_name

[in] Имя объекта.

index

[in] Идентификатор свойства объекта. Может быть любым из значений списка свойств объекта.

Возвращаемое значение

Значение указанного свойства объекта. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

color oldColor=ObjectGet("hline12", OBJPROP_COLOR);

Смотри также

ObjectSet()


ObjectGetFiboDescription

Справочник MQL4 / Графические объекты / ObjectGetFiboDescription

ObjectGetFiboDescription

Возвращает описание уровня объекта Фибоначчи.

string ObjectGetFiboDescription(
string object_name, // имя объекта
int index // индекс уровня
);

Параметры

object_name

[in] Имя объекта Фибоначчи.

index

[in] Индекс уровня объекта Фибоначчи (0-31).

Возвращаемое значение

Описание уровня объекта Фибоначчи. Количество уровней зависит от типа объекта, принадлежащего к группе объектов Фибоначчи. Максимальное количество уровней - 32. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

The amount of Fibonacci levels depends on the object type. The maximum amount of Fibonacci levels is 32.

Пример:

#include <stdlib.mqh>
...
string text;
for(int i=0;i<32;i++)
{
text=ObjectGetFiboDescription(MyObjectName,i);
//---- проверим, возможно уровней у объекта меньше, чем 32
if(GetLastError()!=ERR_NO_ERROR) break;
Print(MyObjectName,"номер уровня: ",i," описание: ",text);
}

Смотри также

ObjectSetFiboDescription()


ObjectGetShiftByValue

Справочник MQL4 / Графические объекты / ObjectGetShiftByValue

ObjectGetShiftByValue

Вычисляет и возвращает номер бара (смещение относительно текущего бара) для указанной цены.

int ObjectGetShiftByValue(
string object_name, // имя объекта
double value // цена
);

Параметры

object_name

[in] Имя объекта.

value

[in] Значение цены.

Возвращаемое значение

Номер бара (смещение относительно текущего бара) для указанной цены. Номер бара вычисляется при помощи линейного уравнения по первой и второй координатам. Применяется для трендовых линий и аналогичных объектов. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

int shift=ObjectGetShiftByValue("MyTrendLine#123", 1.34);

Смотри также

ObjectGetValueByShift()


ObjectGetValueByShift

Справочник MQL4 / Графические объекты / ObjectGetValueByShift

ObjectGetValueByShift

Вычисляет и возвращает значение цены для указанного бара (смещение относительно текущего бара).

double ObjectGetValueByShift(
string object_name, // имя объекта
int shift // номер бара
);

Параметры

object_name

[in] Имя объекта.

shift

[in] Номер бара.

Возвращаемое значение

Значение цены для указанного бара (смещение относительно текущего бара). Значение цены вычисляется при помощи линейного уравнения по первой и второй координатам. Применяется для трендовых линий и аналогичных объектов. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

double price=ObjectGetValueByShift("MyTrendLine#123", 11);

Смотри также

ObjectGetShiftByValue()


ObjectSet

Справочник MQL4 / Графические объекты / ObjectSet

ObjectSet

Изменяет значение указанного свойства объекта.

bool ObjectSet(
string object_name, // имя объекта
int index, // идентификатор свойства
double value // значение
);

Параметры

object_name

[in] Имя объекта.

index

[in] Идентификатор свойства объекта. Может быть любым из значений списка свойств объекта.

value

[in] Новое значение указанного свойства.

Возвращаемое значение

Функция возвращает true в случае удачи, иначе false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

// перемещение первой координаты в конец графика
ObjectSet("MyTrend", OBJPROP_TIME1, Time[0]);
// изменение значения второго уровеня объекта fibo
ObjectSet("MyFibo", OBJPROP_FIRSTLEVEL+1, 1.234);
// установка флага видимости объекта. Объект будет отрисован только на 15-минутном и 1-часовом периодах графика
ObjectSet("MyObject", OBJPROP_TIMEFRAMES, OBJ_PERIOD_M15 | OBJ_PERIOD_H1);

Смотри также

ObjectGet()


ObjectSetFiboDescription

Справочник MQL4 / Графические объекты / ObjectSetFiboDescription

ObjectSetFiboDescription

Устанавливает новое описание уровня объекта Фибоначчи.

bool ObjectSetFiboDescription(
string object_name, // имя объекта
int index, // индекс уровня
string text // описание уровня
);

Параметры

object_name

[in] Имя объекта Фибоначчи.

index

[in] Порядковый номер уровня объекта Фибоначчи (0-31).

text

[in] Новое описание уровня.

Возвращаемое значение

Функция возвращает true в случае удачи, иначе false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

ObjectSetFiboDescription("MyFiboObject",2,"Second line");

Смотри также

ObjectGetFiboDescription()


ObjectSetText

Справочник MQL4 / Графические объекты / ObjectSetText

ObjectSetText

Изменяет описание объекта.

bool ObjectSetText(
string object_name, // имя объекта
string text, // текст описания
int font_size=0, // размер шрифта
string font_name=NULL, // наименование шрифта
color text_color=clrNONE // цвет текста
);

Параметры

object_name

[in] Имя объекта.

text

[in] Текст описания.

font_size=0

[in] Размер шрифта в пунктах.

font_name=NULL

[in] Наименование шрифта.

text_color=clrNONE

[in] Цвет текста.

Возвращаемое значение

Функция возвращает true в случае удачи, иначе false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Для объектов OBJ_TEXT и OBJ_LABEL описание объектов отображается на графике в виде текстовой строки. Параметры font_size, font_name и text_color используются только для объектов OBJ_TEXT и OBJ_LABEL. Для объектов других типов эти параметры игнорируются.

Пример:

ObjectSetText("text_object","Hello world!",10,"Times New Roman",Green);

Смотри также

ObjectDescription()


ObjectType

Справочник MQL4 / Графические объекты / ObjectType

ObjectType

Возвращает тип указанного объекта.

int ObjectType(
string object_name // имя объекта
);

Параметры

object_name

[in] Имя объекта.

Возвращаемое значение

Тип указанного объекта. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

if(ObjectType("line_object2")!=OBJ_HLINE) return(0);

Смотри также

Типы объектов


Технические индикаторы

Справочник MQL4 / Технические индикаторы

Функции для работы с техническими индикаторами

Группа функций, предназначенных для расчета стандартных и пользовательских индикаторов.

Для того, чтобы эксперт (или любая MQL4-программа) мог получить значение какого-либо индикатора, присутствие данного индикатора на текущем графике необязательно. Запрошенный индикатор будет загружен и рассчитан в потоке вызвавшего его модуля.

Любой индикатор может быть рассчитан на данных не только текущего графика, но и на данных любого доступного символа/периода. Если запрашивается информация с другого графика (название инструмента и/или значение таймфрейма отличаются от текущих), то возможна ситуация, что в клиентском терминале не открыт соответствующий график и необходимые данные должны быть запрошены у сервера. В этом случае в переменную last_error будет помещена ошибка ERR_HISTORY_WILL_UPDATED (4066 - запрошенные исторические данные в состоянии обновления) и необходимо через некоторое время повторить попытку запроса (см. пример ArrayCopySeries()).

Все индикаторные функции имеют как минимум 2 параметра - символ и период. Значение символа NULL означает текущий инструмент, значение периода 0 означает текущий таймфрейм.

Функция | Возвращает значение индикатора
iAC | Accelerator Oscillator
iAD | Accumulation/Distribution
iADX | Average Directional Index
iAlligator | Alligator
iAO | Awesome Oscillator
iATR | Average True Range
iBearsPower | Bears Power
iBands | Bollinger Bands®
iBandsOnArray | Возвращает значение технического индикатора Bollinger Bands, рассчитанного на данных, хранящихся в массиве
iBullsPower | Bulls Power
iCCI | Commodity Channel Index
iCCIOnArray | Возвращает значение технического индикатора Commodity Channel Index, рассчитанного на данных, хранящихся в массиве
iCustom | Пользовательский индикатор
iDeMarker | DeMarker
iEnvelopes | Envelopes
iEnvelopesOnArray | Возвращает значение технического индикатора Envelopes, рассчитанного на данных, хранящихся в массиве
iForce | Force Index
iFractals | Fractals
iGator | Gator Oscillator
iIchimoku | Ichimoku Kinko Hyo
iBWMFI | Market Facilitation Index by Bill Williams
iMomentum | Momentum
iMomentumOnArray | Возвращает значение технического индикатора Momentum, рассчитанного на данных, хранящихся в массиве
iMFI | Money Flow Index
iMA | Moving Average
iMAOnArray | Возвращает значение технического индикатора Moving Average, рассчитанного на данных, хранящихся в массиве
iOsMA | Moving Average of Oscillator (MACD histogram)
iMACD | Moving Averages Convergence-Divergence
iOBV | On Balance Volume
iSAR | Parabolic Stop And Reverse System
iRSI | Relative Strength Index
iRSIOnArray | Возвращает значение технического индикатора Relative Strength Index, рассчитанного на данных, хранящихся в массиве
iRVI | Relative Vigor Index
iStdDev | Standard Deviation
iStdDevOnArray | Возвращает значение технического индикатора Standard Deviation, рассчитанного на данных, хранящихся в массиве
iStochastic | Stochastic Oscillator
iWPR | Williams' Percent Range

Что нового в MQL5

В MQL5 количество встроенных технических индикаторов увеличено с 30 до 38, при этом сами индикаторы создаются и управляются с помощью хендлов, чтобы избежать лишних копий и снизить потребление памяти. Для этих же целей представлены новые функции для работы с индикаторами и таймсериями – они позволяют получать значения индикаторов целыми массивами, а не по одному значению.

Для работы с индикаторами добавлены новые функции, среди которых отметим ChartIndicatorAdd() и IndicatorRelease() – с их помощью можно динамически добавлять и удалять индикаторы при создании комплексных инструментов технического анализа.

Функция | Действие
ChartIndicatorAdd | Добавляет на указанное окно графика индикатор с указанным хэндлом
IndicatorRelease | Удаляет хэндл индикатора и освобождает расчетную часть индикатора, если ею больше никто не пользуется


iAC

Справочник MQL4 / Технические индикаторы / iAC

iAC

Возвращает значение индикатора Accelerator/Decelerator.

double iAC(
string symbol, // имя символа
int timeframe, // таймфрейм
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Численное значение технического индикатора Accelerator/Decelerator.

Пример:

double result=iAC(NULL,0,1);


iAD

Справочник MQL4 / Технические индикаторы / iAD

iAD

Возвращает значение индикатора Accumulation/Distribution.

double iAD(
string symbol, // имя символа
int timeframe, // таймфрейм
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Численное значение технического индикатора Accumulation/Distribution.

Пример:

double result=iAD(NULL,0,1);


iADX

Справочник MQL4 / Технические индикаторы / iADX

iADX

Возвращает значение индикатора Average Directional Movement Index.

double iADX(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период усреднения
int applied_price, // используемая цена
int mode, // источник данных
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения для вычисления индекса.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

mode

[in] Индекс линии индикатора. Может быть любым из перечисленных идентификаторов линии индикаторов (0 - MODE_MAIN, 1 - MODE_PLUSDI, 2 - MODE_MINUSDI).

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Численное значение технического индикатора Average Directional Movement Index.

Пример:

if(iADX(NULL,0,14,PRICE_HIGH,MODE_MAIN,0)>iADX(NULL,0,14,PRICE_HIGH,MODE_PLUSDI,0)) return(0);


iAlligator

Справочник MQL4 / Технические индикаторы / iAlligator

iAlligator

Возвращает значение индикатора Alligator.

double iAlligator(
string symbol, // имя символа
int timeframe, // таймфрейм
int jaw_period, // период для расчета челюстей
int jaw_shift, // смещение челюстей по горизонтали
int teeth_period, // период для расчета зубов
int teeth_shift, // смещение зубов по горизонтали
int lips_period, // период для расчета губ
int lips_shift, // смещение губ по горизонтали
int ma_method, // тип сглаживания
int applied_price, // тип цены
int mode, // источник данных
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

jaw_period

[in] Период усреднения синей линии (челюсти аллигатора).

jaw_shift

[in] Смещение синей линии относительно графика цены.

teeth_period

[in] Период усреднения красной линии (зубов аллигатора).

teeth_shift

[in] Смещение красной линии относительно графика цены.

lips_period

[in] Период усреднения зеленой линии (губ аллигатора).

lips_shift

[in] Смещение зеленой линии относительно графика цены.

ma_method

[in] Метод усреднения. Может быть любым из значений перечисления ENUM_MA_METHOD.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

mode

[in] Источник данных, идентификатор одной из линий индикатора. Mожет быть любой из следующих величин:

MODE_GATORJAW - синяя линия (линия челюстей аллигатора),
MODE_GATORTEETH - красная линия (линия зубов аллигатора),
MODE_GATORLIPS - зеленая линия (линия губ аллигатора).

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Численное значение технического индикатора Alligator.

Пример:

double jaw_val=iAlligator(NULL,0,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORJAW,1);


iAO

Справочник MQL4 / Технические индикаторы / iAO

iAO

Возвращает значение технического индикатора Awesome Oscillator.

double iAO(
string symbol, // имя символа
int timeframe, // таймфрейм
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Численное значение технического индикатора Awesome Oscillator.

Пример:

double val=iAO(NULL,0,2);


iATR

Справочник MQL4 / Технические индикаторы / iATR

iATR

Возвращает значение технического индикатора Average True Range.

double iATR(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения для вычисления индикатора.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Численное значение технического индикатора Average True Range.

Пример:

if(iATR(NULL,0,12,0)>iATR(NULL,0,20,0)) return(0);


iBearsPower

Справочник MQL4 / Технические индикаторы / iBearsPower

iBearsPower

Возвращает значение технического индикатора Bears Power.

double iBearsPower(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период
int applied_price, // тип цены
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения для вычисления индикатора.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Bears Power.

Пример:

double val=iBearsPower(NULL,0,13,PRICE_CLOSE,0);


iBands

Справочник MQL4 / Технические индикаторы / iBands

iBands

Возвращает значение технического индикатора Bollinger Bands®.

double iBands(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период
double deviation, // кол-во стандартных отклонений
int bands_shift, // сдвиг относительно цены
int applied_price, // тип цены
int mode, // индекс линии
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения для вычисления индикатора.

deviation

[in] Количество стандартных отклонений от основной линии.

bands_shift

[in] Сдвиг индикатора относительно ценового графика.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

mode

[in] Индекс линии индикатора. Может быть любым из перечисленных идентификаторов линии индикаторов (0 - MODE_MAIN, 1 - MODE_UPPER, 2 - MODE_LOWER).

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Bollinger Bands®.

Пример:

if(iBands(NULL,0,20,2,0,PRICE_LOW,MODE_LOWER,0)>Low[0]) return(0);


iBandsOnArray

Справочник MQL4 / Технические индикаторы / iBandsOnArray

iBandsOnArray

Возвращает значение технического индикатора Bollinger Bands®, рассчитанного на данных, хранящихся в массиве.

double iBandsOnArray(
double array[], // массив
int total, // количество элементов
int period, // период
double deviation, // кол-во стандартных отклонений
int bands_shift, // сдвиг относительно цены
int mode, // индекс линии
int shift // сдвиг
);

Параметры

array[]

[in] Массив с данными.

total

[in] Количество элементов для вычисления. 0 означает все элементы массива.

period

[in] Период усреднения основной линии индикатора.

deviation

[in] Количество стандартных отклонений от основной линии.

bands_shift

[in] Сдвиг индикатора относительно ценового графика.

mode

[in] Индекс линии индикатора. Может быть любым из перечисленных идентификаторов линии индикаторов (0 - MODE_MAIN, 1 - MODE_UPPER, 2 - MODE_LOWER).

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Bollinger Bands®, рассчитанного на данных, хранящихся в массиве array[].

Примечание

В отличие от iBands(...), функция iBandsOnArray не выбирает данные на основе названия инструмента, таймфрейма и используемой цены - ценовые данные должны быть подготовлены заранее. Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries.

Пример:

if(iBandsOnArray(ExtBuffer,total,2,0,0,MODE_LOWER,0)>Low[0]) return(0);


iBullsPower

Справочник MQL4 / Технические индикаторы / iBullsPower

iBullsPower

Возвращает значение технического индикатора Bulls Power.

double iBullsPower(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период
int applied_price, // тип цены
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения для вычисления индикатора.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Bulls Power.

Пример:

double val=iBullsPower(NULL,0,13,PRICE_CLOSE,0);


iCCI

Справочник MQL4 / Технические индикаторы / iCCI

iCCI

Возвращает значение технического индикатора Commodity Channel Index.

double iCCI(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период
int applied_price, // тип цены
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения для вычисления индикатора.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Commodity Channel Index.

Пример:

if(iCCI(Symbol(),0,12,PRICE_TYPICAL,0)>iCCI(Symbol(),0,20,PRICE_TYPICAL,0)) return(0);


iCCIOnArray

Справочник MQL4 / Технические индикаторы / iCCIOnArray

iCCIOnArray

Возвращает значение технического индикатора Commodity Channel Index, рассчитанного на данных, хранящихся в массиве.

double iCCIOnArray(
double array[], // массив
int total, // количество элементов
int period, // период
int shift // сдвиг
);

Параметры

array[]

[in] Массив с данными.

total

[in] Количество элементов для вычисления. 0 означает все элементы массива.

period

[in] Период усреднения для вычисления индикатора.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Commodity Channel Index, рассчитанного на данных, хранящихся в массиве array[].

Примечание

В отличие от iCCI(...), функция iCCIOnArray не выбирает данные на основе названия инструмента, таймфрейма и используемой цены - ценовые данные должны быть подготовлены заранее. Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries().

Пример:

if(iCCIOnArray(ExtBuffer,total,12,0)>iCCIOnArray(ExtBuffer,total,20,0)) return(1);


iCustom

Справочник MQL4 / Технические индикаторы / iCustom

iCustom

Возвращает значение указанного пользовательского индикатора.

double iCustom(
string symbol, // имя символа
int timeframe, // таймфрейм
string name, // папка/имя_пользовательского индикатора
... // список входных параметров индикатора
int mode, // источник данных
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

name

[in] Имя пользовательского индикатора, содержащее путь относительно корневой директории индикаторов (MQL4/Indicators/). Если индикатор находится в поддиректории, например, в MQL4/Indicators/Examples, то имя должно выглядеть соответственно, а именно – "Examples\\имя_индикатора" (обязательно указание двойного обратного слеша вместо одиночного в качестве разделителя).

...

[in] input-параметры пользовательского индикатора, разделенные запятыми. Тип и порядок следования параметров должен соответствовать. Если параметры не указаны, то будут использованы значения по умолчанию.

mode

[in] Индекс линии индикатора. Может принимать значения от 0 до 7 и соответствовать индексу, указанному при вызове функции SetIndexBuffer().

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Численное значение указанного пользовательского индикатора. Пользовательский индикатор должен быть скомпилирован (файл с расширением EX4) и находиться в директории каталог_терминала\MQL4\\Indicators.

Пример:

double val=iCustom(NULL,0,"SampleInd",13,1,0);


iDeMarker

Справочник MQL4 / Технические индикаторы / iDeMarker

iDeMarker

Возвращает значение технического индикатора DeMarker.

double iDeMarker(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения для вычисления индикатора.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Численное значение технического индикатора DeMarker.

Пример:

double val=iDeMarker(NULL,0,13,1);


iEnvelopes

Справочник MQL4 / Технические индикаторы / iEnvelopes

iEnvelopes

Возвращает значение технического индикатора Envelopes.

double iEnvelopes(
string symbol, // имя символа
int timeframe, // таймфрейм
int ma_period, // период
int ma_method, // метод усреднения
int ma_shift, // сдвиг средней
int applied_price, // тип цены
double deviation, // отклонение (в процентах)
int mode, // индекс линии
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

ma_period

[in] Период усреднения для вычисления индикатора.

ma_method

[in] Метод усреднения. Может быть любым из значений перечисления ENUM_MA_METHOD.

ma_shift

[in] Сдвиг индикатора относительно ценового графика.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

deviation

[in] Отклонение от основной линии в процентах.

mode

[in] Индекс линии индикатора. Может быть любым из значений идентификаторов линий индикаторов (0 - MODE_MAIN, 1 - MODE_UPPER, 2 - MODE_LOWER).

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Envelopes.

Пример:

double val=iEnvelopes(NULL,0,13,MODE_SMA,10,PRICE_CLOSE,0.2,MODE_UPPER,0);


iEnvelopesOnArray

Справочник MQL4 / Технические индикаторы / iEnvelopesOnArray

iEnvelopesOnArray

Возвращает значение технического индикатора Envelopes, рассчитанного на данных, хранящихся в массиве.

double iEnvelopesOnArray(
double array[], // массив
int total, // количество элементов
int ma_period, // период
int ma_method, // метод усреднения
int ma_shift, // сдвиг средней
double deviation, // отклонение (в процентах)
int mode, // индекс линии
int shift // сдвиг
);

Параметры

array[]

[in] Массив с данными.

total

[in] Количество элементов для вычисления. 0 означает все элементы массива.

ma_period

[in] Период усреднения для вычисления индикатора.

ma_method

[in] Метод усреднения. Может быть любым из значений перечисления ENUM_MA_METHOD.

ma_shift

[in] Сдвиг индикатора относительно ценового графика.

deviation

[in] Отклонение от основной линии в процентах.

mode

[in] Индекс линии индикатора. Может быть любым из значений идентификаторов линий индикаторов (0 - MODE_MAIN, 1 - MODE_UPPER, 2 - MODE_LOWER).

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Envelopes, рассчитанного на данных, хранящихся в массиве array[].

Примечание

В отличие от iEnvelopes(...), функция iEnvelopesOnArray не выбирает данные на основе названия инструмента, таймфрейма и используемой цены - ценовые данные должны быть подготовлены заранее. Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries().

Пример:

double val=iEnvelopesOnArray(ExtBuffer,10,13,MODE_SMA,0,0.2,MODE_UPPER,0);


iForce

Справочник MQL4 / Технические индикаторы / iForce

iForce

Возвращает значение технического индикатора Force Index.

double iForce(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период
int ma_method, // метод усреднения
int applied_price, // тип цены
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения для вычисления индикатора.

ma_method

[in] Метод усреднения. Может быть любым из значений перечисления ENUM_MA_METHOD.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Force Index.

Пример:

double val=iForce(NULL,0,13,MODE_SMA,PRICE_CLOSE,0);


iFractals

Справочник MQL4 / Технические индикаторы / iFractals

iFractals

Возвращает значение технического индикатора Fractals.

double iFractals(
string symbol, // имя символа
int timeframe, // таймфрейм
int mode, // индекс линии
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

mode

[in] Индекс линии индикатора. Может быть любым из значений идентификаторов линии индикаторов.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Fractals.

Пример:

double val=iFractals(NULL,0,MODE_UPPER,3);


iGator

Справочник MQL4 / Технические индикаторы / iGator

iGator

Возвращает значение осциллятора Gator.

double iGator(
string symbol, // имя символа
int timeframe, // таймфрейм
int jaw_period, // период для расчета челюстей
int jaw_shift, // смещение челюстей по горизонтали
int teeth_period, // период для расчета зубов
int teeth_shift, // смещение зубов по горизонтали
int lips_period, // период для расчета губ
int lips_shift, // смещение губ по горизонтали
int ma_method, // тип сглаживания
int applied_price, // тип цены
int mode, // источник данных
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

jaw_period

[in] Период усреднения синей линии (челюсти аллигатора).

jaw_shift

[in] Смещение синей линии относительно графика цены.

teeth_period

[in] Период усреднения красной линии (зубов аллигатора).

teeth_shift

[in] Смещение красной линии относительно графика цены.

lips_period

[in] Период усреднения зеленой линии (губ аллигатора).

lips_shift

[in] Смещение зеленой линии относительно графика цены.

ma_method

[in] Метод усреднения. Может быть любым из значений методов скользящего среднего (Moving Average).

applied_price

[in] Используемая цена. Может быть любой из ценовых констант.

mode

[in] Источник данных, идентификатор одной из линий индикатора. Mожет быть любой из следующих величин:

MODE_UPPER - верхняя гистограмма,
MODE_LOWER - нижняя гистограмма.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Численное значение осциллятора Gator.

Примечание

Осциллятор показывает разницу между синей и красной линией Аллигатора (верхняя гистограмма) и разницу между красной и зеленой линией (нижняя гистограмма).

Пример:

double diff=iGator(NULL,0,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_UPPER,1);


iIchimoku

Справочник MQL4 / Технические индикаторы / iIchimoku

iIchimoku

Возвращает значение индикатора Ichimoku Kinko Hyo.

double iIchimoku(
string symbol, // имя символа
int timeframe, // таймфрейм
int tenkan_sen, // период Tenkan-sen
int kijun_sen, // период Kijun-sen
int senkou_span_b, // период Senkou Span B
int mode, // источник данных
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

period

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

tenkan_sen

[in] Период усреднения Tenkan Sen.

kijun_sen

[in] Период усреднения Kijun Sen.

senkou_span_b

[in] Период усреднения Senkou Span B.

mode

[in] Источник данных. Может быть одним из перечисленных идентификаторов Ichimoku Kinko Hyo (1 - MODE_TENKANSEN, 2 - MODE_KIJUNSEN, 3 - MODE_SENKOUSPANA, 4 - MODE_SENKOUSPANB, 5 - MODE_CHIKOUSPAN).

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Численное значение индикатора Ichimoku Kinko Hyo.

Пример:

double tenkan_sen=iIchimoku(NULL,0,9,26,52,MODE_TENKANSEN,1);


iBWMFI

Справочник MQL4 / Технические индикаторы / iBWMFI

iBWMFI

Возвращает значение технического индикатора Market Facilitation Index.

double iBWMFI(
string symbol, // имя символа
int timeframe, // таймфрейм
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Численное значение технического индикатора Market Facilitation Index.

Пример:

double val=iBWMFI(NULL,10,0);


iMomentum

Справочник MQL4 / Технические индикаторы / iMomentum

iMomentum

Возвращает значение технического индикатора Momentum.

double iMomentum(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период
int applied_price, // тип цены
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения для вычисления индикатора.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Momentum.

Пример:

if(iMomentum(NULL,0,12,PRICE_CLOSE,0)>iMomentum(NULL,0,20,PRICE_CLOSE,0)) return(0);


iMomentumOnArray

Справочник MQL4 / Технические индикаторы / iMomentumOnArray

iMomentumOnArray

Возвращает значение технического индикатора Momentum, рассчитанного на данных, хранящихся в массиве.

double iMomentumOnArray(
double array[], // массив
int total, // количество элементов
int period, // период
int shift // сдвиг
);

Параметры

array[]

[in] Массив с данными.

total

[in] Количество элементов для вычисления. 0 означает все элементы массива.

period

[in] Период усреднения для вычисления индикатора.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Momentum, рассчитанного на данных, хранящихся в массиве array[].

Примечание

В отличие от iMomentum(...), функция iMomentumOnArray не выбирает данные на основе названия инструмента, таймфрейма и используемой цены - ценовые данные должны быть подготовлены заранее. Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries().

Пример:

if(iMomentumOnArray(mybuffer,100,12,0)>iMomentumOnArray(mybuffer,100,20,0)) return(0);


iMFI

Справочник MQL4 / Технические индикаторы / iMFI

iMFI

Возвращает значение технического индикатора Money Flow Index.

double iMFI(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения для вычисления индикатора.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Численное значение технического индикатора Money Flow Index.

Пример:

if(iMFI(NULL,0,14,0)>iMFI(NULL,0,14,1)) return(0);


iMA

Справочник MQL4 / Технические индикаторы / iMA

iMA

Возвращает значение технического индикатора Moving Average.

double iMA(
string symbol, // имя символа
int timeframe, // таймфрейм
int ma_period, // период
int ma_shift, // сдвиг средней
int ma_method, // метод усреднения
int applied_price, // тип цены
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

ma_period

[in] Период усреднения для вычисления индикатора.

ma_shift

[in] Сдвиг индикатора относительно ценового графика.

ma_method

[in] Метод усреднения. Может быть любым из значений перечисления ENUM_MA_METHOD.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Moving Average.

Пример:

AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);


iMAOnArray

Справочник MQL4 / Технические индикаторы / iMAOnArray

iMAOnArray

Возвращает значение технического индикатора Moving Average, рассчитанного на данных, хранящихся в массиве.

double iMAOnArray(
double array[], // массив
int total, // количество элементов
int ma_period, // период
int ma_shift, // сдвиг средней
int ma_method, // метод усреднения
int shift // сдвиг
);

Параметры

array[]

[in] Массив с данными.

total

[in] Количество элементов для вычисления. 0 означает все элементы массива.

ma_period

[in] Период усреднения для вычисления индикатора.

ma_shift

[in] Сдвиг индикатора относительно ценового графика.

ma_method

[in] Метод усреднения. Может быть любым из значений перечисления ENUM_MA_METHOD.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Moving Average, рассчитанного на данных, хранящихся в массиве array[].

Примечание

В отличие от iMA(...), функция iMAOnArray не выбирает данные на основе названия инструмента, таймфрейма и используемой цены - ценовые данные должны быть подготовлены заранее. Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries().

Пример:

double macurrent=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,0);
double macurrentslow=iMAOnArray(ExtBuffer,0,10,0,MODE_LWMA,0);
double maprev=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,1);
double maprevslow=iMAOnArray(ExtBuffer,0,10,0,MODE_LWMA,1);
//----
if(maprev<maprevslow && macurrent>=macurrentslow)
Alert("crossing up");


iOsMA

Справочник MQL4 / Технические индикаторы / iOsMA

iOsMA

Возвращает значение технического индикатора Moving Average of Oscillator.

double iOsMA(
string symbol, // имя символа
int timeframe, // таймфрейм
int fast_ema_period, // период быстрой средней
int slow_ema_period, // период медленной средней
int signal_period, // период сигнальной линии
int applied_price, // тип цены
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

fast_ema_period

[in] Период усреднения для вычисления быстрой скользящей средней.

slow_ema_period

[in] Период усреднения для вычисления медленной скользящей средней.

signal_period

[in] Период усреднения для вычисления сигнальной линии.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Moving Average of Oscillator.

Пример:

if(iOsMA(NULL,0,12,26,9,PRICE_OPEN,1)>iOsMA(NULL,0,12,26,9,PRICE_OPEN,0)) return(0);


iMACD

Справочник MQL4 / Технические индикаторы / iMACD

iMACD

Возвращает значение технического индикатора Moving Averages Convergence/Divergence.

double iMACD(
string symbol, // имя символа
int timeframe, // таймфрейм
int fast_ema_period, // период быстрой средней
int slow_ema_period, // период медленной средней
int signal_period, // период сигнальной линии
int applied_price, // тип цены
int mode, // индекс линии индикатора
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

fast_ema_period

[in] Период усреднения для вычисления быстрой скользящей средней.

slow_ema_period

[in] Период усреднения для вычисления медленной скользящей средней.

signal_period

[in] Период усреднения для вычисления сигнальной линии.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

mode

[in] Индекс линии индикатора. Может быть одним из значений идентификаторов линии индикаторов (0-MODE_MAIN, 1-MODE_SIGNAL).

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Moving Average of Oscillator.

Примечание

В тех системах, где ОsМА называют гистограммой MACD, данный индикатор изображается в виде двух линий. В клиентском терминале схождение/расхождение скользящих средних рисуется в виде гистограммы.

Пример:

if(iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)>iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0)) return(0);


iOBV

Справочник MQL4 / Технические индикаторы / iOBV

iOBV

Возвращает значение технического индикатора On Balance Volume.

double iOBV(
string symbol, // имя символа
int timeframe, // таймфрейм
int applied_price, // тип цены
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора On Balance Volume.

Пример:

double val=iOBV(NULL,0,PRICE_CLOSE,1);


iSAR

Справочник MQL4 / Технические индикаторы / iSAR

iSAR

Возвращает значение индикатора Parabolic Stop and Reverse system.

double iSAR(
string symbol, // имя символа
int timeframe, // таймфрейм
double step, // шаг изменения цены - коэффициент ускорения
double maximum, // максимальный шаг
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

step

[in] Шаг изменения цены, обычно 0.02.

maximum

[in] Максимальный шаг, обычно 0.2.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Parabolic Stop and Reverse system.

Пример:

if(iSAR(NULL,0,0.02,0.2,0)>Close[0]) return(0);


iRSI

Справочник MQL4 / Технические индикаторы / iRSI

iRSI

Возвращает значение технического индикатора Relative Strength Index.

double iRSI(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период
int applied_price, // тип цены
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения для вычисления индекса.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Relative Strength Index.

Пример:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>iRSI(NULL,0,14,PRICE_CLOSE,1)) return(0);


iRSIOnArray

Справочник MQL4 / Технические индикаторы / iRSIOnArray

iRSIOnArray

Возвращает значение технического индикатора Relative Strength Index, рассчитанного на данных, хранящихся в массиве.

double iRSIOnArray(
double array[], // массив
int total, // количество элементов
int period, // период
int shift // сдвиг
);

Параметры

array[]

[in] Массив с данными.

total

[in] Количество элементов для вычисления. 0 означает все элементы массива.

period

[in] Период усреднения для вычисления индикатора.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Relative Strength Index, рассчитанного на данных, хранящихся в массиве array[].

Примечание

В отличие от iRSI(...), функция iRSIOnArray не выбирает данные на основе названия инструмента, таймфрейма и используемой цены - ценовые данные должны быть подготовлены заранее. Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries().

Пример:

if(iRSIOnArray(ExtBuffer,1000,14,0)>iRSI(NULL,0,14,PRICE_CLOSE,1)) return(0);


iRVI

Справочник MQL4 / Технические индикаторы / iRVI

iRVI

Возвращает значение технического индикатора Relative Vigor Index.

double iRVI(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период
int mode, // индекс линии
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения для вычисления индекса.

mode

[in] Индекс линии индикатора. Может быть любым из значений идентификаторов линии индикаторов.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Relative Vigor Index.

Пример:

double val=iRVI(NULL,0,10,MODE_MAIN,0);


iStdDev

Справочник MQL4 / Технические индикаторы / iStdDev

iStdDev

Возвращает значение технического индикатора Standard Deviation.

double iStdDev(
string symbol, // имя символа
int timeframe, // таймфрейм
int ma_period, // период
int ma_shift, // сдвиг средней
int ma_method, // метод усреднения
int applied_price, // тип цены
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

ma_period

[in] Период усреднения для вычисления индикатора.

ma_shift

[in] Сдвиг индикатора относительно ценового графика.

ma_method

[in] Метод усреднения. Может быть любым из значений перечисления ENUM_MA_METHOD.

applied_price

[in] Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Standard Deviation.

Пример:

double val=iStdDev(NULL,0,10,0,MODE_EMA,PRICE_CLOSE,0);


iStdDevOnArray

Справочник MQL4 / Технические индикаторы / iStdDevOnArray

iStdDevOnArray

Возвращает значение технического индикатора Standard Deviation, рассчитанного на данных, хранящихся в массиве.

double iStdDevOnArray(
double array[], // массив
int total, // количество элементов
int ma_period, // период
int ma_shift, // сдвиг средней
int ma_method, // метод усреднения
int shift // сдвиг
);

Параметры

array[]

[in] Массив с данными.

total

[in] Количество элементов для вычисления. 0 означает все элементы массива.

ma_period

[in] Период усреднения для вычисления индикатора.

ma_shift

[in] Сдвиг индикатора относительно ценового графика.

ma_method

[in] Метод усреднения. Может быть любым из значений перечисления ENUM_MA_METHOD.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Standard Deviation, рассчитанного на данных, хранящихся в массиве array[].

Примечание

В отличие от iStdDev(...), функция iStdDevOnArray не выбирает данные на основе названия инструмента, таймфрейма и используемой цены - ценовые данные должны быть подготовлены заранее. Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries().

Пример:

double val=iStdDevOnArray(ExtBuffer,100,10,0,MODE_EMA,0);


iStochastic

Справочник MQL4 / Технические индикаторы / iStochastic

iStochastic

Возвращает значение технического индикатора Stochastic Oscillator.

double iStochastic(
string symbol, // имя символа
int timeframe, // таймфрейм
int Kperiod, // период линии K
int Dperiod, // период линии D
int slowing, // замедление
int method, // метод усреднения
int price_field, // тип цены
int mode, // индекс линии
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

Kperiod

[in] Период (количество баров) для вычисления линии %K.

Dperiod

[in] Период усреднения для вычисления линии %D.

slowing

[in] Значение замедления.

method

[in] Метод усреднения. Может быть любым из значений перечисления ENUM_MA_METHOD.

price_field

[in] Параметр выбора цен для расчета. Может быть одной из следующих величин: 0 - Low/High или 1 - Close/Close.

mode

[in] Индекс линии индикатора (0 - MODE_MAIN, 1 - MODE_SIGNAL).

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Stochastic Oscillator.

Пример:

if(iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0)>iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0)) return(0);


iWPR

Справочник MQL4 / Технические индикаторы / iWPR

iWPR

Возвращает значение технического индикатора Larry Williams' Percent Range.

double iWPR(
string symbol, // имя символа
int timeframe, // таймфрейм
int period, // период
int shift // сдвиг
);

Параметры

symbol

[in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

period

[in] Период усреднения (количество баров) для вычисления индикатора.

shift

[in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Larry Williams' Percent Range.

Пример:

if(iWPR(NULL,0,14,0)>iWPR(NULL,0,14,1)) return(0);


Работа с событиями

Справочник MQL4 / Работа с событиями

Работа с событиями

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

Функция | Действие
EventSetMillisecondTimer | Запускает генератор событий таймера высокого разрешения с периодом менее 1 секунды для текущего графика
EventSetTimer | Запускает генератор событий таймера с указанной периодичностью для текущего графика
EventKillTimer | Останавливает на текущем графике генерацию событий по таймеру
EventChartCustom | Генерирует пользовательское событие для указанного графика

Смотри также

Типы событий графика


EventSetMillisecondTimer

Справочник MQL4 / Работа с событиями / EventSetMillisecondTimer

EventSetMillisecondTimer

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

bool EventSetMillisecondTimer(
int milliseconds // количество миллисекунд
);

Параметры

milliseconds

[in] Количество миллисекунд, определяющее периодичность возникновения событий от таймера.

Возвращаемое значение

В случае успешного выполнения возвращает true, иначе - false. Для получения кода ошибки нужно вызвать функцию GetLastError().

Примечание

Эта функция предназначена для тех случаев, когда требуется таймер высокого разрешения и нужно получать события таймера чаще, чем один раз в секунду. Если вам достаточно обычного таймера с периодом в несколько секунд, то используйте EventSetTimer().

Обычно эта функция должна вызываться из функции OnInit() или в конструкторе класса. Для того чтобы обрабатывать события, приходящие от таймера, эксперт или индикатор должен иметь функцию OnTimer().

Каждый эксперт и каждый индикатор работает со своим таймером и получает события только от него. При завершении работы mql4-программы таймер уничтожается принудительно, если он был создан, но не был отключен функцией EventKillTimer().

Для каждой программы может быть запущено не более одного таймера. Каждая mql4-программа и каждый график имеют свою собственную очередь событий, куда складываются все вновь поступающие события. Если в очереди уже есть событие Timer либо это событие находится в состоянии обработки, то новое событие Timer в очередь mql4-программы не ставится.


EventSetTimer

Справочник MQL4 / Работа с событиями / EventSetTimer

EventSetTimer

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

bool EventSetTimer(
int seconds // количество секунд
);

Параметры

seconds

[in] Количество секунд, определяющее периодичность возникновения событий от таймера.

Возвращаемое значение

В случае успешного выполнения возвращает true, иначе false. Для получения кода ошибки нужно вызвать функцию GetLastError().

Примечание

Обычно, эта функция должна вызываться из функции OnInit() или в конструкторе класса. Для того чтобы обрабатывать события, приходящие от таймера, эксперт или индикатор должен иметь функцию OnTimer().

Каждый эксперт и каждый индикатор работает со своим таймером, и получает события только от него. При завершении работы mql4-программы таймер уничтожается принудительно, если он был создан, но не был отключен функцией EventKillTimer().

Для каждой программы может быть запущено не более одного таймера. Каждая mql4-программа и каждый график имеют свою собственную очередь событий, куда складываются все вновь поступающие события. Если в очереди уже есть событие Timer либо это событие находится в состоянии обработки, то новое событие Timer в очередь mql4-программы не ставится.


EventKillTimer

Справочник MQL4 / Работа с событиями / EventKillTimer

EventKillTimer

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

void EventKillTimer();

Возвращаемое значение

Нет возвращаемого значения.

Примечание

Обычно эта функция должна вызываться из функции OnDeinit() в том случае, если в функции OnInit() была вызвана функция EventSetTimer(). Либо должна вызываться из деструктора класса, если в конструкторе этого класса вызывается функция EventSetTimer().

Каждый эксперт и каждый индикатор работает со своим таймером, и получает события только от него. При завершении работы mql4-программы таймер уничтожается принудительно, если он был создан, но не был отключен функцией EventKillTimer().


EventChartCustom

Справочник MQL4 / Работа с событиями / EventChartCustom

EventChartCustom

Генерирует пользовательское событие для указанного графика.

bool EventChartCustom(
long chart_id, // идентификатор графика-получателя события
ushort custom_event_id, // идентификатор события
long lparam, // параметр типа long
double dparam, // параметр типа double
string sparam // строковый параметр события
);

Параметры

chart_id

[in] Идентификатор графика. 0 означает текущий график.

custom_event_id

[in] Идентификатор пользовательского события. Этот идентификатор автоматически добавляется к значению CHARTEVENT_CUSTOM и преобразуется к целому типу.

lparam

[in] Параметр события типа long, передаваемый функции OnChartEvent.

dparam

[in] Параметр события типа double, передаваемый функции OnChartEvent.

sparam

[in] Параметр события типа string, передаваемый функции OnChartEvent. Если строка имеет длину больше, чем 63 символа, то строка усекается.

Возвращаемое значение

Возвращает true в случае удачной постановки пользовательского события в очередь событий графика – получателя события. В случае ошибки возвращает false, для получения кода ошибки используйте GetLastError().

Примечание

Эксперт или индикатор, прикрепленный к указанному графику, обрабатывает данное событие при помощи функции OnChartEvent(int event_id, long& lparam, double& dparam, string& sparam).

Для каждого типа события входные параметры функции OnChartEvent() имеют определенные значения, которые необходимы для обработки этого события. В таблице перечислены события и значения, которые передаются через параметры.

Событие | Значение параметра id | Значение параметра lparam | Значение параметра dparam | Значение параметра sparam
Событие нажатия клавиатуры | CHARTEVENT_KEYDOWN | код нажатой клавиши | Количество нажатий клавиши,сгенерированных за время её удержания в нажатом состоянии | Строковое значение битовой маски, описывающее статус кнопок клавиатуры
События мыши (если для графика установлено свойство CHART_EVENT_MOUSE_MOVE=true) | CHARTEVENT_MOUSE_MOVE | X координата | Y координата | Строковое значение битовой маски, описывающее статус кнопок мыши
Событие создания графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_CREATE=true) | CHARTEVENT_OBJECT_CREATE | — | — | Имя созданного графического объекта
Событие изменения свойств объекта через диалог свойств | CHARTEVENT_OBJECT_CHANGE | — | — | Имя измененного графического объекта
Событие удаления графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_DELETE=true) | CHARTEVENT_OBJECT_DELETE | — | — | Имя удаленного графического объекта
Событие щелчка мыши на графике | CHARTEVENT_CLICK | X координата | Y координата | —
Событие щелчка мыши на графическом объекте | CHARTEVENT_OBJECT_CLICK | X координата | Y координата | Имя графического объекта, на котором произошло событие
Событие перемещения графического объекта при помощи мыши | CHARTEVENT_OBJECT_DRAG | — | — | Имя перемещенного графического объекта
Событие окончания редактирования текста в поле ввода графического объекта "Поле ввода" | CHARTEVENT_OBJECT_ENDEDIT | — | — | Имя графического объекта "Поле ввода", в котором завершилось редактирование текста
Событие изменения графика | CHARTEVENT_CHART_CHANGE | — | — | —
Пользовательское событие с номером N | CHARTEVENT_CUSTOM+N | Значение, заданное функцией EventChartCustom() | Значение, заданное функцией EventChartCustom() | Значение, заданное функцией EventChartCustom()

Пример:

//+------------------------------------------------------------------+
//| ButtonClickExpert.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"

string buttonID="Button";
string labelID="Info";
int broadcastEventID=5000;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- создадим кнопку, для передачи пользовательских событий
ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
ObjectSetInteger(0,buttonID,OBJPROP_COLOR,clrWhite);
ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,clrGray);
ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100);
ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200);
ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
ObjectSetString(0,buttonID,OBJPROP_TEXT,"Кнопка");
ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);

//--- создадим метку для вывода информации
ObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
ObjectSetInteger(0,labelID,OBJPROP_COLOR,clrRed);
ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50);
ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
ObjectSetString(0,labelID,OBJPROP_TEXT,"Нет информации");
ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0);

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
ObjectDelete(0,buttonID);
ObjectDelete(0,labelID);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---

}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- проверим событие на нажатие кнопки мышки
if(id==CHARTEVENT_OBJECT_CLICK)
{
string clickedChartObject=sparam;
//--- если нажатие на объекте с именем buttonID
if(clickedChartObject==buttonID)
{
//--- состояние кнопки - нажата кнопка или нет
bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
//--- выведем в лог отладочное сообщение
Print("Кнопка нажата = ",selected);
int customEventID; // номер пользовательского события для отправки
string message; // сообщение для отправки в событии
//--- если кнопка нажата
if(selected)
{
message="Кнопка нажата";
customEventID=CHARTEVENT_CUSTOM+1;
}
else // кнопка не нажата
{
message="Кнопка отжата";
customEventID=CHARTEVENT_CUSTOM+999;
}
//--- отправим пользовательское событие "своему"графику
EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
//--- отправим сообщение всем открытым графикам
BroadcastEvent(ChartID(),0,"Broadcast Message");
//--- отладочное сообщение
Print("Отправлено событие с ID = ",customEventID);
}
ChartRedraw();// принудительно перерисуем все объекты на графике
}

//--- проверим событие на принадлежность к пользовательским событиям
if(id>CHARTEVENT_CUSTOM)
{
if(id==broadcastEventID)
{
Print("Получили широковещательное сообщение от графика с id = "+lparam);
}
else
{
//--- прочитаем текстовое сообщение в событии
string info=sparam;
Print("Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID = ",id);
//--- выведем сообщение в метке
ObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
ChartRedraw();// принудительно перерисуем все объекты на графике
}
}
}
//+------------------------------------------------------------------+
//| послать широковещательное сообщение всем открытым графикам |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam,double dparam,string sparam)
{
int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
long currChart=ChartFirst();
int i=0;
while(i<CHARTS_MAX) // у нас наверняка не больше CHARTS_MAX открытых графиков
{
EventChartCustom(currChart,eventID,lparam,dparam,sparam);
currChart=ChartNext(currChart); // на основании предыдущего получим новый график
if(currChart==-1) break; // достигли конца списка графиков
i++; // не забудем увеличить счетчик
}
}
//+------------------------------------------------------------------+

Смотри также

События клиентского терминала, Функции обработки событий


Устаревшие функции

Справочник MQL4 / Устаревшие функции

Устаревшие функции

В процессе дальнейшей разработки языка MQL4 в целях систематизации некоторые функции были переименованы и перемещены из одной группы в другую.

Старые названия функций не подсвечиваются и не связаны со справкой MetaEditor. Старые названия функций можно использовать, так как компилятор правильно их воспримет. Однако мы настоятельно рекомендуем использовать новые названия.

Старое название | Новое название
BarsPerWindow | WindowBarsPerChart
ClientTerminalName | TerminalName
CurTime | TimeCurrent
CompanyName | TerminalCompany
FirstVisibleBar | WindowFirstVisibleBar
Highest | iHighest
HistoryTotal | OrdersHistoryTotal
LocalTime | TimeLocal
Lowest | iLowest
ObjectsRedraw | WindowRedraw
PriceOnDropped | WindowPriceOnDropped
ScreenShot | WindowScreenShot
ServerAddress | AccountServer
TimeOnDropped | WindowTimeOnDropped


Список функций языка MQL4

Справочник MQL4 / Список функций языка MQL4

Список функций языка MQL4

Все функции MQL4 в алфавитном порядке.

Функция | Действие | Раздел
AccountBalance | Возвращает значение баланса активного счета | Информация о счете
AccountCompany | Возвращает название брокерской компании, в которой зарегистрирован текущий счет | Информация о счете
AccountCredit | Возвращает значение кредита активного счета | Информация о счете
AccountCurrency | Возвращает наименование валюты текущего счета | Информация о счете
AccountEquity | Возвращает сумму собственных средств текущего счета | Информация о счете
AccountFreeMargin | Возвращает значение свободных средств, разрешенных для открытия ордеров на текущем счете | Информация о счете
AccountFreeMarginCheck | Возвращает размер свободных средств, которые останутся после открытия указанного ордера по текущей цене на текущем счете | Информация о счете
AccountFreeMarginMode | Возвращает режим расчета свободных средств, разрешенных для открытия ордеров на текущем счете | Информация о счете
AccountInfoDouble | Возвращает значение типа double соответствующего свойства счета | Информация о счете
AccountInfoInteger | Возвращает значение целочисленного типа (bool,int или long) соответствующего свойства счета | Информация о счете
AccountInfoString | Возвращает значение типа string соответствующего свойства счета | Информация о счете
AccountLeverage | Возвращает значение плеча текущего счета | Информация о счете
AccountMargin | Возвращает сумму залоговых средств, используемых для поддержания открытых ордеров на текущем счете | Информация о счете
AccountName | Возвращает имя пользователя текущего счета | Информация о счете
AccountNumber | Возвращает номер текущего счета | Информация о счете
AccountProfit | Возвращает значение прибыли текущего счета | Информация о счете
AccountServer | Возвращает наименование активного сервера | Информация о счете
AccountStopoutLevel | Возвращает значение уровня, по которому определяется состояние Stop Out | Информация о счете
AccountStopoutMode | Возвращает режим расчета уровня Stop Out | Информация о счете
acos | Возвращает значение арккосинуса x в радианах | Математические функции
Alert | Выводит сообщение в отдельном окне | Общие функции
ArrayBsearch | Возвращает индекс первого найденного элемента в первом измерении массива | Операции с массивами
ArrayCompare | Возвращает результат сравнения двух массивов простых типов или пользовательских структур, не имеющих сложных объектов | Операции с массивами
ArrayCopy | Копирует один массив в другой | Операции с массивами
ArrayCopyRates | Копирует в двумерный массив вида RateInfo[][6], данные баров текущего графика и возвращает количество скопированных баров | Операции с массивами
ArrayCopySeries | Копирует массив-таймсерию в пользовательский массив и возвращает количество скопированных элементов | Операции с массивами
ArrayDimension | Возвращает ранг многомерного массива | Операции с массивами
ArrayFill | Заполняет числовой массив указанным значением | Операции с массивами
ArrayFree | Освобождает буфер любого динамического массива и устанавливает размер нулевого измерения в 0 (ноль) | Операции с массивами
ArrayGetAsSeries | Проверяет направление индексации массива | Операции с массивами
ArrayInitialize | Устанавливает все элементы числового массива в одну величину | Операции с массивами
ArrayIsDynamic | Проверяет, является ли массив динамическим | Операции с массивами
ArrayIsSeries | Проверяет, является ли массив таймсерией | Операции с массивами
ArrayMaximum | Поиск элемента с максимальным значением | Операции с массивами
ArrayMinimum | Поиск элемента с минимальным значением | Операции с массивами
ArrayRange | Возвращает число элементов в указанном измерении массива | Операции с массивами
ArrayResize | Устанавливает новый размер в первом измерении массива | Операции с массивами
ArraySetAsSeries | Устанавливает направление индексирования в массиве | Операции с массивами
ArraySize | Возвращает количество элементов в массиве | Операции с массивами
ArraySort | Сортировка числовых массивов по первому измерению | Операции с массивами
asin | Возвращает значение арксинуса x в радианах | Математические функции
atan | Возвращает арктангенс x в радианах | Математические функции
Bars | Возвращает количество баров в истории по соответствующему символу периоду | Доступ к таймсериям и индикаторам
ceil | Возвращает ближайшее сверху целое числовое значение | Математические функции
CharArrayToString | Преобразует код символа (ansi) в односимвольную строку | Преобразование данных
ChartApplyTemplate | Применяет к указанному графику шаблон из указанного файла | Операции с графиками
ChartClose | Закрывает указанный график | Операции с графиками
ChartFirst | Возвращает идентификатор первого графика клиентского терминала | Операции с графиками
ChartGetDouble | Возвращает значение соответствующего свойства указанного графика | Операции с графиками
ChartGetInteger | Возвращает целочисленное значение соответствующего свойства указанного графика | Операции с графиками
ChartGetString | Возвращает строковое значение соответствующего свойства указанного графика | Операции с графиками
ChartID | Возвращает идентификатор текущего графика | Операции с графиками
ChartIndicatorDelete | Удаляет с указанного окна графика индикатор с указанным именем | Операции с графиками
ChartIndicatorName | Возвращает короткое имя индикатора по номеру в списке индикаторов на указанном окне графика. | Операции с графиками
ChartIndicatorsTotal | Возвращает количество всех индикаторов, присоединенных к указанному окну графика. | Операции с графиками
ChartNavigate | Осуществляет сдвиг указанного графика на указанное количество баров относительно указанной позиции графика | Операции с графиками
ChartNext | Возвращает идентификатор графика, следующего за указанным | Операции с графиками
ChartOpen | Открывает новый график с указанным символом и периодом | Операции с графиками
CharToStr | Преобразует код символа в односимвольную строку | Преобразование данных
CharToString | Преобразование кода символа в односимвольную строку | Преобразование данных
ChartPeriod | Возвращает значение периода указанного графика | Операции с графиками
ChartPriceOnDropped | Возвращает ценовую координату, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт | Операции с графиками
ChartRedraw | Вызывает принудительную перерисовку указанного графика | Операции с графиками
ChartSaveTemplate | Сохраняет текущие настройки графика в шаблон с указанным именем | Операции с графиками
ChartScreenShot | Делает снимок указанного графика в формате gif | Операции с графиками
ChartSetDouble | Задает значение типа double соответствующего свойства указанного графика | Операции с графиками
ChartSetInteger | Задает значение целочисленного типа (datetime, int, color, bool или char) соответствующего свойства указанного графика | Операции с графиками
ChartSetString | Задает значение типа string соответствующего свойства указанного графика | Операции с графиками
ChartSetSymbolPeriod | Меняет значения символа и периода указанного графика | Операции с графиками
ChartSymbol | Возвращает имя символа указанного графика | Операции с графиками
ChartTimeOnDropped | Возвращает временную координату, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт | Операции с графиками
ChartTimePriceToXY | Преобразует координаты графика из представления время/цена в координаты по оси X и Y | Операции с графиками
ChartWindowFind | Возвращает номер подокна, в котором находится индикатор | Операции с графиками
ChartWindowOnDropped | Возвращает номер подокна графика, на которое брошен мышкой данный эксперт, скрипт, объект или индикатор | Операции с графиками
ChartXOnDropped | Возвращает координату по оси X, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт | Операции с графиками
ChartXYToTimePrice | Преобразует координаты X и Y графика в значения время и цена | Операции с графиками
ChartYOnDropped | Возвращает координату по оси Y, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт | Операции с графиками
CheckPointer | Возвращает тип указателя объекта | Общие функции
ColorToARGB | Преобразует тип color в тип uint для получения ARGB-представления цвета | Преобразование данных
ColorToString | Преобразует значение цвета в строку вида "R,G,B" | Преобразование данных
Comment | Выводит сообщение в левый верхний угол ценового графика | Общие функции
CopyClose | Получает в массив исторические данные по цене закрытия баров по соответствующим символу и периоду | Доступ к таймсериям и индикаторам
CopyHigh | Получает в массив исторические данные по максимальной цене баров по соответствующим символу и периоду | Доступ к таймсериям и индикаторам
CopyLow | Получает в массив исторические данные по минимальной цене баров по соответствующим символу и периоду | Доступ к таймсериям и индикаторам
CopyOpen | Получает в массив исторические данные по цене открытия баров по соответствующим символу и периоду | Доступ к таймсериям и индикаторам
CopyRates | Получает в массив исторические данные структуры Rates для указанных символа и периода | Доступ к таймсериям и индикаторам
CopyTickVolume | Получает в массив исторические данные по тиковым объемам для соответствующих символа и периода | Доступ к таймсериям и индикаторам
CopyTime | Получает в массив исторические данные по времени открытия баров по соответствующим символу и периоду | Доступ к таймсериям и индикаторам
cos | Возвращает косинус числа | Математические функции
CryptDecode | Производит обратное преобразование данных массива | Общие функции
CryptEncode | Преобразует данные массива-источника в массив-приемник указанным методом | Общие функции
Day | Возвращает текущий день месяца, т.е. день месяца последнего известного времени сервера | Дата и время
DayOfWeek | Возвращает порядковый номер дня недели последнего известного времени сервера | Дата и время
DayOfYear | Возвращает текущий день года последнего известного времени сервера | Дата и время
DebugBreak | Программная точка останова при отладке | Общие функции
Digits | Возвращает количество десятичных знаков после запятой, определяющее точность измерения цены символа текущего графика | Проверка состояния
DoubleToStr | Преобразует числовое значение в текстовую строку, содержащую символьное представление числа в указанном формате точности | Преобразование данных
DoubleToString | Преобразование числового значения в текстовую строку с указанной точностью | Преобразование данных
EnumToString | Преобразование значения перечисления любого типа в строку | Преобразование данных
EventChartCustom | Генерирует пользовательское событие для указанного графика | Работа с событиями
EventKillTimer | Останавливает на текущем графике генерацию событий по таймеру | Работа с событиями
EventSetMillisecondTimer | Запускает генератор событий таймера высокого разрешения с периодом менее 1 секунды для текущего графика | Работа с событиями
EventSetTimer | Запускает генератор событий таймера с указанной периодичностью для текущего графика | Работа с событиями
exp | Возвращает экспоненту числа | Математические функции
ExpertRemove | Прекращает работу эксперта и выгружает его с графика | Общие функции
fabs | Возвращает абсолютное значение (значение по модулю) переданного ей числа | Математические функции
FileClose | Закрывает ранее открытый файл | Файловые операции
FileCopy | Копирует исходный файл из локальной или общей папки в другой файл | Файловые операции
FileDelete | Удаляет указанный файл | Файловые операции
FileFindClose | Закрывает хэндл поиска | Файловые операции
FileFindFirst | Начинает перебор файлов в соответствующей директории в соответствии с указанным фильтром | Файловые операции
FileFindNext | Продолжает поиск, начатый функцией FileFindFirst() | Файловые операции
FileFlush | Сброс на диск всех данных, оставшихся в файловом буфере ввода-вывода | Файловые операции
FileGetInteger | Получает целочисленное свойство файла | Файловые операции
FileIsEnding | Определяет конец файла в процессе чтения | Файловые операции
FileIsExist | Проверяет существование файла | Файловые операции
FileIsLineEnding | Определяет конец строки в текстовом файле в процессе чтения | Файловые операции
FileMove | Перемещает или переименовывает файл | Файловые операции
FileOpen | Открывает файл с указанным именем и указанными флагам | Файловые операции
FileOpenHistory | Открывает файл в текущей папке истории или ее подпапках | Файловые операции
FileReadArray | Читает массивы любых типов, кроме строковых (может быть массив структур, не содержащих строки и динамические массивы), из бинарного файла с текущего положения файлового указателя | Файловые операции
FileReadBool | Читает из файла типа CSV строку от текущего положения до разделителя (либо до конца текстовой строки) и преобразует прочитанную строку в значение типа bool | Файловые операции
FileReadDatetime | Читает из файла типа CSV строку одного из форматов: "YYYY.MM.DD HH:MM:SS", "YYYY.MM.DD" или "HH:MM:SS" - и преобразует ее в значение типа datetime | Файловые операции
FileReadDouble | Читает число двойной точности с плавающей точкой (double) из бинарного файла с текущего положения файлового указателя | Файловые операции
FileReadFloat | Читает из текущего положения файлового указателя значение типа float | Файловые операции
FileReadInteger | Читает из бинарного файла значение типа int, short или char в зависимости от указанной длины в байтах | Файловые операции
FileReadLong | Читает из текущего положения файлового указателя значение типа long | Файловые операции
FileReadNumber | Читает из файла типа CSV строку от текущего положения до разделителя (либо до конца текстовой строки) и преобразует прочитанную строку в значение типа double | Файловые операции
FileReadString | Читает из файла строку с текущего положения файлового указателя | Файловые операции
FileReadStruct | Cчитывает из бинарного файла содержимое в структуру, переданную в качестве параметра | Файловые операции
FileSeek | Перемещает положение файлового указателя на указанное количество байт относительно указанного положения | Файловые операции
FileSize | Возвращает размер соответствующего открытого файла | Файловые операции
FileTell | Возвращает текущее положение файлового указателя соответствующего открытого файла | Файловые операции
FileWrite | Записывает данные в файл типа CSV или TXT | Файловые операции
FileWriteArray | Записывает в файл типа BIN массивы любых типов, кроме строковых | Файловые операции
FileWriteDouble | Записывает в двоичный файл значение параметра типа double с текущего положения файлового указателя | Файловые операции
FileWriteFloat | Записывает в двоичный файл значение параметра типа float с текущего положения файлового указателя | Файловые операции
FileWriteInteger | Записывает в двоичный файл значение параметра типа int с текущего положения файлового указателя | Файловые операции
FileWriteLong | Записывает в двоичный файл значение параметра типа long с текущего положения файлового указателя | Файловые операции
FileWriteString | Записывает в файл типа BIN или TXT значение параметра типа string с текущего положения файлового указателя | Файловые операции
FileWriteStruct | Записывает в двоичный файл содержимое структуры, переданной в качестве параметра, с текущего положения файлового указателя | Файловые операции
floor | Возвращает ближайшее снизу целое числовое значение | Математические функции
fmax | Возвращает максимальное из двух числовых значений | Математические функции
fmin | Возвращает минимальное из двух числовых значений | Математические функции
fmod | Возвращает вещественный остаток от деления двух чисел | Математические функции
FolderClean | Удаляет все файлы в указанной папке | Файловые операции
FolderCreate | Создает директорию в папке Files (в зависимости от значения common_flag) | Файловые операции
FolderDelete | Удаляет указанную директорию. Если папка не пуста, то она не может быть удалена | Файловые операции
GetLastError | Возвращает значение последней ошибки | Проверка состояния
GetPointer | Возвращает указатель объекта | Общие функции
GetTickCount | Возвращает количество миллисекунд, прошедших с момента старта системы | Общие функции
GlobalVariableCheck | Проверяет существование глобальной переменной с указанным именем | Глобальные переменные терминала
GlobalVariableDel | Удаляет глобальную переменную | Глобальные переменные терминала
GlobalVariableGet | Запрашивает значение глобальной переменной | Глобальные переменные терминала
GlobalVariableName | Возвращает имя глобальной переменной по порядковому номеру в списке глобальных переменных | Глобальные переменные терминала
GlobalVariablesDeleteAll | Удаляет глобальные переменные с указанным префиксом в имени | Глобальные переменные терминала
GlobalVariableSet | Устанавливает новое значение глобальной переменной | Глобальные переменные терминала
GlobalVariableSetOnCondition | Устанавливает новое значение существующей глобальной переменной по условию | Глобальные переменные терминала
GlobalVariablesFlush | Принудительно записывает содержимое всех глобальных переменных на диск | Глобальные переменные терминала
GlobalVariablesTotal | Возвращает общее количество глобальных переменных | Глобальные переменные терминала
GlobalVariableTemp | Устанавливает новое значение глобальной переменной, которая существует только на время текущего сеанса работы терминала | Глобальные переменные терминала
GlobalVariableTime | Возвращает время последнего доступа к глобальной переменной | Глобальные переменные терминала
HideTestIndicators | Выставляет флаг скрытия индикаторов, вызываемых экспертом | Пользовательские индикаторы
Hour | Возвращает текущий час последнего известного серверного времени на момент старта программы | Дата и время
iAC | Accelerator Oscillator | Технические индикаторы
iAD | Accumulation/Distribution | Технические индикаторы
iADX | Average Directional Index | Технические индикаторы
iAlligator | Alligator | Технические индикаторы
iAO | Awesome Oscillator | Технические индикаторы
iATR | Average True Range | Технические индикаторы
iBands | Bollinger Bands® | Технические индикаторы
iBandsOnArray | Возвращает значение технического индикатора Bollinger Bands, рассчитанного на данных, хранящихся в массиве | Технические индикаторы
iBars | Возвращает количество баров в истории по соответствующему символу и периоду | Доступ к таймсериям и индикаторам
iBarShift | Возвращает смещение бара, которому принадлежит указанное время | Доступ к таймсериям и индикаторам
iBearsPower | Bears Power | Технические индикаторы
iBullsPower | Bulls Power | Технические индикаторы
iBWMFI | Market Facilitation Index by Bill Williams | Технические индикаторы
iCCI | Commodity Channel Index | Технические индикаторы
iCCIOnArray | Возвращает значение технического индикатора Commodity Channel Index, рассчитанного на данных, хранящихся в массиве | Технические индикаторы
iClose | Возвращает значение цены закрытия бара соответствующего графика | Доступ к таймсериям и индикаторам
iCustom | Пользовательский индикатор | Технические индикаторы
iDeMarker | DeMarker | Технические индикаторы
iEnvelopes | Envelopes | Технические индикаторы
iEnvelopesOnArray | Возвращает значение технического индикатора Envelopes, рассчитанного на данных, хранящихся в массиве | Технические индикаторы
iForce | Force Index | Технические индикаторы
iFractals | Fractals | Технические индикаторы
iGator | Gator Oscillator | Технические индикаторы
iHigh | Возвращает значение максимальной цены бара соответствующего графика | Доступ к таймсериям и индикаторам
iHighest | Возвращает индекс наибольшего найденного значения соответствующего графика | Доступ к таймсериям и индикаторам
iIchimoku | Ichimoku Kinko Hyo | Технические индикаторы
iLow | Возвращает значение минимальной цены бара соответствующего графика | Доступ к таймсериям и индикаторам
iLowest | Возвращает индекс наименьшего найденного значения соответствующего графика | Доступ к таймсериям и индикаторам
iMA | Moving Average | Технические индикаторы
iMACD | Moving Averages Convergence-Divergence | Технические индикаторы
iMAOnArray | Возвращает значение технического индикатора Moving Average, рассчитанного на данных, хранящихся в массиве | Технические индикаторы
iMFI | Money Flow Index | Технические индикаторы
iMomentum | Momentum | Технические индикаторы
iMomentumOnArray | Возвращает значение технического индикатора Momentum, рассчитанного на данных, хранящихся в массиве | Технические индикаторы
IndicatorBuffers | Распределяет память для буферов, используемых для вычислений пользовательского индикатора | Пользовательские индикаторы
IndicatorCounted | Возвращает количество баров, не измененных после последнего вызова индикатора | Пользовательские индикаторы
IndicatorDigits | Устанавливает формат точности (количество знаков после десятичной точки) для визуализации значений индикатора | Пользовательские индикаторы
IndicatorSetDouble | Задает значение свойства индикатора, имеющего тип double | Пользовательские индикаторы
IndicatorSetInteger | Задает значение свойства индикатора,имеющего тип int | Пользовательские индикаторы
IndicatorSetString | Задает значение свойства индикатора, имеющего тип string | Пользовательские индикаторы
IndicatorShortName | Устанавливает "короткое" имя пользовательского индикатора для отображения в подокне индикатора и в окне DataWindow | Пользовательские индикаторы
IntegerToString | Преобразование значения целого типа в строку указанной длины | Преобразование данных
iOBV | On Balance Volume | Технические индикаторы
iOpen | Возвращает значение цены открытия бара соответствующего графика | Доступ к таймсериям и индикаторам
iOsMA | Moving Average of Oscillator (MACD histogram) | Технические индикаторы
iRSI | Relative Strength Index | Технические индикаторы
iRSIOnArray | Возвращает значение технического индикатора Relative Strength Index, рассчитанного на данных, хранящихся в массиве | Технические индикаторы
iRVI | Relative Vigor Index | Технические индикаторы
iSAR | Parabolic Stop And Reverse System | Технические индикаторы
IsConnected | Возвращает состояние главного соединения клиентского терминала с сервером, по которому производится подкачка данных | Проверка состояния
IsDemo | Возвращает признак работы на демонстрационном счете | Проверка состояния
IsDllsAllowed | Возвращает информацию о возможности вызова внешних функций из DLL | Проверка состояния
IsExpertEnabled | Возвращает информацию о возможности запуска экспертов | Проверка состояния
IsLibrariesAllowed | Возвращает информацию о возможности вызова библиотек | Проверка состояния
IsOptimization | Возвращает информацию о работе эксперта в процессе оптимизации параметров тестирования | Проверка состояния
IsStopped | Возвращает true, если поступила команда завершить выполнение mql4-программы | Проверка состояния
iStdDev | Standard Deviation | Технические индикаторы
iStdDevOnArray | Возвращает значение технического индикатора Standard Deviation, рассчитанного на данных, хранящихся в массиве | Технические индикаторы
IsTesting | Возвращает информацию о работе эксперта в режиме тестирования | Проверка состояния
iStochastic | Stochastic Oscillator | Технические индикаторы
IsTradeAllowed | Возвращает информацию о возможности торговли при помощи экспертов | Проверка состояния
IsTradeContextBusy | Возвращает информацию о состоянии потока выполнения торговых операций | Проверка состояния
IsVisualMode | Возвращает информацию о работе эксперта в режиме визуализации тестирования | Проверка состояния
iTime | Возвращает значение времени открытия бара соответствующего графика | Доступ к таймсериям и индикаторам
iVolume | Возвращает значение тикового объема бара соответствующего графика | Доступ к таймсериям и индикаторам
iWPR | Williams' Percent Range | Технические индикаторы
log | Возвращает натуральный логарифм | Математические функции
log10 | Возвращает логарифм числа по основанию 10 | Математические функции
MarketInfo | Возвращает различную информацию о финансовых инструментах, перечисленных в окне "Обзор рынка" | Получение рыночной информации
MathAbs | Возвращает абсолютное значение (значение по модулю) переданного ей числа | Математические функции
MathArccos | Возвращает значение арккосинуса x в радианах | Математические функции
MathArcsin | Возвращает значение арксинуса x в радианах | Математические функции
MathArctan | Возвращает арктангенс x в радианах | Математические функции
MathCeil | Возвращает ближайшее сверху целое числовое значение | Математические функции
MathCos | Возвращает косинус числа | Математические функции
MathExp | Возвращает экспоненту числа | Математические функции
MathFloor | Возвращает ближайшее снизу целое числовое значение | Математические функции
MathIsValidNumber | Проверяет корректность действительного числа | Математические функции
MathLog | Возвращает натуральный логарифм | Математические функции
MathLog10 | Возвращает логарифм числа по основанию 10 | Математические функции
MathMax | Возвращает максимальное из двух числовых значений | Математические функции
MathMin | Возвращает минимальное из двух числовых значений | Математические функции
MathMod | Возвращает вещественный остаток от деления двух чисел | Математические функции
MathPow | Возводит основание в указанную степень | Математические функции
MathRand | Возвращает псевдослучайное целое число в диапазоне от 0 до 32767 | Математические функции
MathRound | Округляет число до ближайшего целого | Математические функции
MathSin | Возвращает синус числа | Математические функции
MathSqrt | Возвращает квадратный корень | Математические функции
MathSrand | Устанавливает начальное состояние генератора псевдослучайных целых чисел | Математические функции
MathTan | Возвращает тангенс числа | Математические функции
MessageBox | Создает и отображает окно сообщений, а также управляет им | Общие функции
Minute | Возвращает текущую минуту последнего известного серверного времени на момент старта программы | Дата и время
Month | Возвращает номер текущего месяца последнего известного времени сервера | Дата и время
MQLInfoInteger | Возвращает значение целого типа соответствующего свойства запущенной mql4-программы | Проверка состояния
MQLInfoString | Возвращает значение типа string соответствующего свойства запущенной mql4-программы | Проверка состояния
MQLSetInteger | Устанавливает значение свойства MQL_CODEPAGE в окружении mql4-программы | Проверка состояния
NormalizeDouble | Округление числа с плавающей точкой до указанной точности | Преобразование данных
ObjectCreate | Создает объект заданного типа в указанном подокне графика | Графические объекты
ObjectDelete | Удаляет объект с указанным именем | Графические объекты
ObjectDescription | Возвращает описание объекта | Графические объекты
ObjectFind | Ищет по имени объект с указанным именем | Графические объекты
ObjectGet | Возвращает значение указанного свойства объекта | Графические объекты
ObjectGetDouble | Возвращает значение типа double соответствующего свойства объекта | Графические объекты
ObjectGetFiboDescription | Возвращает описание уровня объекта Фибоначчи | Графические объекты
ObjectGetInteger | Возвращает целочисленное значение соответствующего свойства объекта | Графические объекты
ObjectGetShiftByValue | Вычисляет и возвращает номер бара (смещение относительно текущего бара) для указанной цены | Графические объекты
ObjectGetString | Возвращает значение типа string соответствующего свойства объекта | Графические объекты
ObjectGetTimeByValue | Возвращает значение времени для указанного значения цены объекта | Графические объекты
ObjectGetValueByShift | Вычисляет и возвращает значение цены для указанного бара (смещение относительно текущего бара) | Графические объекты
ObjectGetValueByTime | Возвращает ценовое значение объекта для указанного времени | Графические объекты
ObjectMove | Изменяет координаты указанной точки привязки объекта | Графические объекты
ObjectName | Возвращает имя объекта по порядковому номеру в списке объектов | Графические объекты
ObjectsDeleteAll | Удаляет все объекты с указанным типом и в указанном подокне графика | Графические объекты
ObjectSet | Изменяет значение указанного свойства объекта | Графические объекты
ObjectSetDouble | Устанавливает значение соответствующего свойства объекта | Графические объекты
ObjectSetFiboDescription | Устанавливает новое описание уровня объекта Фибоначчи | Графические объекты
ObjectSetInteger | Устанавливает значение соответствующего свойства объекта | Графические объекты
ObjectSetString | Устанавливает значение соответствующего свойства объекта | Графические объекты
ObjectSetText | Изменяет описание объекта | Графические объекты
ObjectsTotal | Возвращает общее число объектов указанного типа на графике | Графические объекты
ObjectType | Возвращает тип указанного объекта | Графические объекты
OrderClose | Осуществляет закрытие ордера | Торговые функции
OrderCloseBy | Осуществляет закрытие одного открытого ордера другим ордером, открытым по тому же самому инструменту, но в противоположном направлении | Торговые функции
OrderClosePrice | Возвращает цену закрытия выбранного ордера | Торговые функции
OrderCloseTime | Возвращает время закрытия выбранного ордера | Торговые функции
OrderComment | Возвращает комментарий выбранного ордера | Торговые функции
OrderCommission | Возвращает значение рассчитанной комиссии выбранного ордера | Торговые функции
OrderDelete | Осуществляет удаление ранее установленного отложенного ордера | Торговые функции
OrderExpiration | Возвращает дату истечения выбранного отложенного ордера | Торговые функции
OrderLots | Возвращает количество лотов выбранного ордера | Торговые функции
OrderMagicNumber | Возвращает идентификационное ("магическое") число выбранного ордера | Торговые функции
OrderModify | Изменяет параметры ранее открытых или отложенных ордеров | Торговые функции
OrderOpenPrice | Возвращает цену открытия выбранного ордера | Торговые функции
OrderOpenTime | Возвращает время открытия выбранного ордера | Торговые функции
OrderPrint | Выводит в журнал информацию о свойствах выбранного ордера | Торговые функции
OrderProfit | Возвращает значение чистой прибыли выбранного ордера | Торговые функции
OrderSelect | Выбирает ордер для дальнейшей работы с ним | Торговые функции
OrderSend | Основная функция, используемая для совершения торговых операций или установки отложенного ордера | Торговые функции
OrdersHistoryTotal | Возвращает количество закрытых и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале | Торговые функции
OrderStopLoss | Возвращает значение цены закрытия ордера при достижении убыточности (stop loss) текущего выбранного ордера. | Торговые функции
OrdersTotal | Возвращает общее количество открытых и отложенных ордеров | Торговые функции
OrderSwap | Возвращает значение свопа текущего выбранного ордера | Торговые функции
OrderSymbol | Возвращает наименование финансового инструмента текущего выбранного ордера | Торговые функции
OrderTakeProfit | Возвращает значение цены закрытия ордера при достижении уровня прибыльности (take profit) текущего выбранного ордера | Торговые функции
OrderTicket | Возвращает номер тикета текущего выбранного ордера | Торговые функции
OrderType | Возвращает тип операции текущего выбранного ордера | Торговые функции
Period | Возвращает значение таймфрейма текущего графика | Проверка состояния
Period | Возвращает период текущего графика | Операции с графиками
PeriodSeconds | Возвращает количество секунд в периоде | Общие функции
PlaySound | Воспроизводит звуковой файл | Общие функции
Point | Возвращает размер пункта текущего инструмента в валюте котировки | Проверка состояния
pow | Возводит основание в указанную степень | Математические функции
Print | Выводит сообщение в журнал | Общие функции
PrintFormat | Форматирует и печатает наборы символов и значений в лог-файл в соответствие с заданным форматом | Общие функции
rand | Возвращает псевдослучайное целое число в диапазоне от 0 до 32767 | Математические функции
RefreshRates | Осуществляет обновление данных в предопределенных переменных и массивах-таймсериях | Доступ к таймсериям и индикаторам
ResetLastError | Устанавливает значение предопределенной переменной _LastError в ноль | Общие функции
ResourceCreate | Создает ресурс изображения на основе набора данных | Общие функции
ResourceFree | Удаляет динамически созданный ресурс (освобождает занятую ресурсом память) | Общие функции
ResourceReadImage | Читает данные графического ресурса, созданного функцией ResourceCreate() или сохраненного в EX4-файле при компиляции | Общие функции
ResourceSave | Сохраняет ресурс в указанный файл | Общие функции
round | Округляет число до ближайшего целого | Математические функции
Seconds | Возвращает количество секунд, прошедших с начала текущей минуты последнего известного серверного времени на момент старта программы | Дата и время
SendFTP | Посылает файл по адресу, указанному в окне настроек на закладке "FTP" | Общие функции
SendMail | Посылает электронное письмо по адресу, указанному в окне настроек на закладке "Почта" | Общие функции
SendNotification | Посылает Push-уведомления в мобильные терминалы, чьи MetaQuotes ID указаны на закладке "Уведомления" | Общие функции
SeriesInfoInteger | Возвращает информацию о состоянии исторических данных | Доступ к таймсериям и индикаторам
SetIndexArrow | Устанавливает значок для линии индикаторов, имеющей стиль DRAW_ARROW | Пользовательские индикаторы
SetIndexBuffer | Связывает указанный индикаторный буфер с одномерным динамическим массивом типа double | Пользовательские индикаторы
SetIndexDrawBegin | Устанавливает порядковый номер бара от начала данных, с которого должна начинаться отрисовка указанной линии индикатора | Пользовательские индикаторы
SetIndexEmptyValue | Устанавливает значение пустой величины для линии индикатора | Пользовательские индикаторы
SetIndexLabel | Устанавливает текст описания линии индикатора для отображения информации в окне DataWindow и всплывающей подсказке | Пользовательские индикаторы
SetIndexShift | Устанавливает смещение линии индикатора относительно начала графика | Пользовательские индикаторы
SetIndexStyle | Устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора | Пользовательские индикаторы
SetLevelStyle | Устанавливает новый стиль, ширину и цвет для горизонтальных уровней индикатора, выводимого в отдельное окно | Пользовательские индикаторы
SetLevelValue | Устанавливает значение указанного горизонтального уровня индикатора, выводимого в отдельное окно | Пользовательские индикаторы
ShortArrayToString | Копирует часть массива в строку | Преобразование данных
ShortToString | Преобразование код символа (unicode) в односимвольную строку | Преобразование данных
SignalBaseGetDouble | Возвращает значение свойства типа double для выбранного сигнала | Управление сигналами
SignalBaseGetInteger | Возвращает значение свойства типа integer для выбранного сигнала | Управление сигналами
SignalBaseGetString | Возвращает значение свойства типа string для выбранного сигнала | Управление сигналами
SignalBaseSelect | Выбирает для работы сигнал из базы торговых сигналов, доступных в терминале | Управление сигналами
SignalBaseTotal | Возвращает общее количество сигналов, доступных в терминале | Управление сигналами
SignalInfoGetDouble | Возвращает из настроек копирования торгового сигнала значение свойства типа double | Управление сигналами
SignalInfoGetInteger | Возвращает из настроек копирования торгового сигнала значение свойства типа integer | Управление сигналами
SignalInfoGetString | Возвращает из настроек копирования торгового сигнала значение свойства типа string | Управление сигналами
SignalInfoSetDouble | Устанавливает в настройках копирования торгового сигнала значение свойства типа double | Управление сигналами
SignalInfoSetInteger | Устанавливает в настройках копирования торгового сигнала значение свойства типа integer | Управление сигналами
SignalSubscribe | Производит подписку на копирование торгового сигнала | Управление сигналами
SignalUnsubscribe | Отменяет подписку на копирование торгового сигнала | Управление сигналами
sin | Возвращает синус числа | Математические функции
Sleep | Задерживает выполнение текущего эксперта или скрипта на определенный интервал | Общие функции
sqrt | Возвращает квадратный корень | Математические функции
srand | Устанавливает начальное состояние генератора псевдослучайных целых чисел | Математические функции
StringAdd | Присоединяет к концу строки по месту указанную подстроку | Строковые функции
StringBufferLen | Возвращает размер буфера, распределенного для строки | Строковые функции
StringCompare | Сравнивает две строки и возвращает 1, если первая строка больше второй; 0 - если строки равны; -1 (минус один) - если первая строка меньше второй | Строковые функции
StringConcatenate | Формирует строку из переданных параметров | Строковые функции
StringFill | Заполняет указанную строку по месту указанными символами | Строковые функции
StringFind | Поиск подстроки в строке | Строковые функции
StringFormat | Преобразует число в строку в соответствие с заданным форматом | Преобразование данных
StringGetChar | Возвращает значение символа, расположенного в указанной позиции строки | Строковые функции
StringGetCharacter | Возвращает значение символа, расположенного в указанной позиции строки | Строковые функции
StringInit | Инициализирует строку указанными символами и обеспечивает указанный размер строки | Строковые функции
StringLen | Возвращает число символов в строке | Строковые функции
StringReplace | Заменяет в строке все найденные подстроки на заданную последовательность символов. | Строковые функции
StringSetChar | Возвращает копию строки с измененным значением символа в указанной позиции | Строковые функции
StringSetCharacter | Возвращает true при успешной вставке символа в переданную строку | Строковые функции
StringSplit | Получает из указанной строки подстроки по заданному разделителю и возвращает количество полученных подстрок | Строковые функции
StringSubstr | Извлекает подстроку из текстовой строки, начинающейся c указанной позиции | Строковые функции
StringToCharArray | Посимвольно копирует преобразованную из Unicode в ANSI строку в указанное место массива типа uchar | Преобразование данных
StringToColor | Преобразует строку типа "R,G,B" или строку, содержащую наименование цвета, в значение типа color | Преобразование данных
StringToDouble | Преобразование строки, содержащей символьное представление числа, в число типа double | Преобразование данных
StringToInteger | Преобразование строки, содержащей символьное представление числа, в число типа int | Преобразование данных
StringToLower | Преобразует все символы указанной строки в строчные (маленькие) по месту | Строковые функции
StringToShortArray | Посимвольно копирует строку в указанное место массива типа ushort | Преобразование данных
StringToTime | Преобразование строки, содержащей время и/или дату в формате "yyyy.mm.dd [hh:mi]", в число типа datetime | Преобразование данных
StringToUpper | Преобразует все символы указанной строки в прописные (большие) по месту | Строковые функции
StringTrimLeft | Удаляет символы перевода каретки, пробелы и символы табуляции с начала строки | Строковые функции
StringTrimRight | Удаляет символы перевода каретки, пробелы и символы табуляции в конце строки | Строковые функции
StrToDouble | Преобразует строку, содержащую символьное представление числа, в число типа double | Преобразование данных
StrToInteger | Преобразует строку, содержащую символьное представление числа, в число типа int | Преобразование данных
StrToTime | Преобразует строку, содержащую время и/или дату в формате "yyyy.mm.dd [hh:mi]", в число типа datetime | Преобразование данных
StructToTime | Производит конвертацию из переменной типа структуры MqlDateTime в значение типа datetime | Дата и время
Symbol | Возвращает имя символа текущего графика | Проверка состояния
Symbol | Возвращает текстовую строку с именем текущего финансового инструмента | Операции с графиками
SymbolInfoDouble | Возвращает значение типа double указанного символа для соответствующего свойства | Получение рыночной информации
SymbolInfoInteger | Возвращает значение целочисленного типа (long, datetime, int или bool) указанного символа для соответствующего свойства | Получение рыночной информации
SymbolInfoSessionQuote | Позволяет получить время начала и время окончания указанной котировочной сессии для указанных символа и дня недели. | Получение рыночной информации
SymbolInfoSessionTrade | Позволяет получить время начала и время окончания указанной торговой сессии для указанных символа и дня недели. | Получение рыночной информации
SymbolInfoString | Возвращает значение типа string указанного символа для соответствующего свойства | Получение рыночной информации
SymbolInfoTick | Возвращает текущие цены для указанного символа в переменной типа MqlTick | Получение рыночной информации
SymbolName | Возвращает наименование указанного символа | Получение рыночной информации
SymbolSelect | Выбирает символ в окне "Обзор рынка" или убирает символ из окна | Получение рыночной информации
SymbolsTotal | Возвращает количество доступных (выбранных в в окне "Обзор рынка" или всех) символов | Получение рыночной информации
tan | Возвращает тангенс числа | Математические функции
TerminalClose | Посылает терминалу команду на завершение работы | Общие функции
TerminalCompany | Возвращает наименование компании-владельца клиентского терминала | Проверка состояния
TerminalInfoDouble | Возвращает значение типа double соответствующего свойства запущенной mql4-программы | Проверка состояния
TerminalInfoInteger | Возвращает значение типа int соответствующего свойства окружения mql4-программы | Проверка состояния
TerminalInfoString | Возвращает значение типа string соответствующего свойства окружения mql4-программы | Проверка состояния
TerminalName | Возвращает наименование клиентского терминала | Проверка состояния
TerminalPath | Возвращает каталог, из которого запущен клиентский терминал | Проверка состояния
TesterStatistics | Возвращает значение указанного статистического показателя, рассчитанного по результатам тестирования | Общие функции
TextGetSize | Возвращает ширину и высоту строки при текущих настройках шрифта | Графические объекты
TextOut | Выводит текст в пользовательский массив (буфер), предназначенный для создания графического ресурса | Графические объекты
TextSetFont | Устанавливает шрифт для вывода текста методами рисования (по умолчанию используется шрифт Arial 20) | Графические объекты
TimeCurrent | Возвращает последнее известное время сервера (время прихода последней котировки) в формате datetime | Дата и время
TimeDay | Возвращает день месяца (1 - 31) указанной даты | Дата и время
TimeDaylightSavings | Возвращает признак перехода на летнее /зимнее время | Дата и время
TimeDayOfWeek | Возвращает день недели указанной даты | Дата и время
TimeDayOfYear | Возвращает день года указанной даты | Дата и время
TimeGMT | Возвращает время GMT формате datetime с учетом перехода на зимнее или летнее время по локальному времени компьютера, на котором запущен клиентский терминал | Дата и время
TimeGMTOffset | Возвращает текущую разницу между временем GMT и локальным временем компьютера в секундах с учетом перехода на зимнее или летнее время | Дата и время
TimeHour | Возвращает час указанного времени | Дата и время
TimeLocal | Возвращает локальное компьютерное время в формате datetime | Дата и время
TimeMinute | Возвращает минуту указанного времени | Дата и время
TimeMonth | Возвращает номер месяца указанного времени | Дата и время
TimeSeconds | Возвращает количество секунд, прошедших с начала минуты указанного времени | Дата и время
TimeToStr | Преобразует значение, содержащее время в секундах, прошедшее с 01.01.1970, в строку формата "yyyy.mm.dd hh:mi". | Преобразование данных
TimeToString | Преобразование значения, содержащего время в секундах, прошедшее с 01.01.1970, в строку формата "yyyy.mm.dd hh:mi" | Преобразование данных
TimeToStruct | Производит конвертацию из значения типа datetime в переменную типа структуры MqlDateTime | Дата и время
TimeYear | Возвращает год указанной даты | Дата и время
UninitializeReason | Возвращает код причины деинициализации | Проверка состояния
WebRequest | Отправляет HTTP-запрос на указанный сервер | Общие функции
WindowBarsPerChart | Возвращает количество баров, помещающихся в окно текущего графика | Операции с графиками
WindowExpertName | Возвращает имя выполняющегося эксперта, скрипта, пользовательского индикатора или библиотеки | Операции с графиками
WindowFind | Возвращает номер подокна графика, содержащего индикатор с указанным именем | Операции с графиками
WindowFirstVisibleBar | Возвращает номер первого видимого бара в окне текущего графика | Операции с графиками
WindowHandle | Возвращает системный дескриптор окна, содержащего указанный график | Операции с графиками
WindowIsVisible | Возвращает состояние видимости подокна графика | Операции с графиками
WindowOnDropped | Возвращает индекс окна, в которое был брошен эксперт, пользовательский индикатор или скрипт | Операции с графиками
WindowPriceMax | Возвращает максимальное значение вертикальной шкалы указанного подокна текущего графика | Операции с графиками
WindowPriceMin | Возвращает минимальное значение вертикальной шкалы указанного подокна текущего графика | Операции с графиками
WindowPriceOnDropped | Возвращает значение цены в точке графика, на который был брошен эксперт или скрипт | Операции с графиками
WindowRedraw | Принудительно перерисовывает текущий график | Операции с графиками
WindowScreenShot | Сохраняет изображение текущего графика в файле формата GIF, PNG или BMP в зависимости от указанного расширения | Операции с графиками
WindowsTotal | Возвращает количество окон индикаторов на графике, включая главное окно графика | Операции с графиками
WindowTimeOnDropped | Возвращает значение времени в точке графика, на который был брошен эксперт или скрипт | Операции с графиками
WindowXOnDropped | Возвращает значение координаты по оси X в пикселах точки клиентской области окна графика, на которой был брошен эксперт или скрипт | Операции с графиками
WindowYOnDropped | Возвращает значение координаты по оси Y в пикселах точки клиентской области окна графика, на которой был брошен эксперт или скрипт | Операции с графиками
Year | Возвращает текущий год, т.е. год последнего известного времени сервера | Дата и время
ZeroMemory | Обнуляет переменную, переданную по ссылке. Тип переменной может быть любым, исключение составляют только классы и структуры, имеющие конструкторы | Общие функции


Список констант языка MQL4

Справочник MQL4 / Список констант языка MQL4 Назад

Список констант языка MQL4

Все константы MQL4 в алфавитном порядке.

Константа

Описание

Использование

__DATE__

Дата компиляции файла без времени (часы, минуты и секунды равны 0)

Предопределенные макроподстановки

__DATETIME__

Дата и время компиляции файла

Предопределенные макроподстановки

__FILE__

Имя текущего компилируемого файла

Предопределенные макроподстановки

__FUNCSIG__

Сигнатура функции, в теле которой расположен макрос. Вывод в лог полного описания функции с типами параметров может пригодиться при идентификации перегруженных функций

Предопределенные макроподстановки

__FUNCTION__

Имя функции, в теле которой расположен макрос

Предопределенные макроподстановки

__LINE__

Номер строки в исходном коде, на которой расположен данный макрос

Предопределенные макроподстановки

__MQLBUILD__, __MQL4BUILD__

Номер билда компилятора

Предопределенные макроподстановки

__PATH__

Абсолютный путь к текущему компилируемому файлу

Предопределенные макроподстановки

ACCOUNT_BALANCE

Баланс счета в валюте депозита

AccountInfoDouble

ACCOUNT_COMPANY

Имя компании, обслуживающей счет

AccountInfoString

ACCOUNT_CREDIT

Размер предоставленного кредита в валюте депозита

AccountInfoDouble

ACCOUNT_CURRENCY

Валюта депозита

AccountInfoString

ACCOUNT_EQUITY

Значение собственных средств на счете в валюте депозита

AccountInfoDouble

ACCOUNT_MARGIN_FREE

Размер свободных средств на счете в валюте депозита, доступных для открытия ордера

AccountInfoDouble

ACCOUNT_LEVERAGE

Размер предоставленного плеча

AccountInfoInteger

ACCOUNT_LIMIT_ORDERS

Максимально допустимое количество действующих отложенных ордеров (0-ограничений нет)

AccountInfoInteger

ACCOUNT_LOGIN

Номер счета

AccountInfoInteger

ACCOUNT_MARGIN

Размер зарезервированных залоговых средств на счете в валюте депозита

AccountInfoDouble

ACCOUNT_MARGIN_LEVEL

Уровень залоговых средств на счете в процентах

AccountInfoDouble

ACCOUNT_MARGIN_SO_CALL

Уровень залоговых средств, при котором требуется пополнение счета (Margin Call). В зависимости от установленного ACCOUNT_MARGIN_SO_MODE выражается в процентах либо в валюте депозита

AccountInfoDouble

ACCOUNT_MARGIN_SO_MODE

Режим задания минимально допустимого уровня залоговых средств

AccountInfoInteger

ACCOUNT_MARGIN_SO_SO

Уровень залоговых средств, при достижении которого происходит принудительное закрытие самой убыточного ордера (Stop Out). В зависимости от установленного ACCOUNT_MARGIN_SO_MODE выражается в процентах либо в валюте депозита

AccountInfoDouble

ACCOUNT_NAME

Имя клиента

AccountInfoString

ACCOUNT_PROFIT

Размер текущей прибыли на счете в валюте депозита

AccountInfoDouble

ACCOUNT_SERVER

Имя торгового сервера

AccountInfoString

ACCOUNT_STOPOUT_MODE_MONEY

Уровень задается в деньгах

AccountInfoInteger

ACCOUNT_STOPOUT_MODE_PERCENT

Уровень задается в процентах

AccountInfoInteger

ACCOUNT_TRADE_ALLOWED

Разрешенность торговли для текущего счета

AccountInfoInteger

ACCOUNT_TRADE_EXPERT

Разрешенность торговли для эксперта

AccountInfoInteger

ACCOUNT_TRADE_MODE

Тип торгового счета

AccountInfoInteger

ACCOUNT_TRADE_MODE_CONTEST

Конкурсный торговый счет

AccountInfoInteger

ACCOUNT_TRADE_MODE_DEMO

Демонстрационный торговый счет

AccountInfoInteger

ACCOUNT_TRADE_MODE_REAL

Реальный торговый счет

AccountInfoInteger

ALIGN_CENTER

Выравнивание по центру (только для объекта "Поле ввода")

ObjectGetInteger, ObjectSetInteger, ChartScreenShot

ALIGN_LEFT

Выравнивание по левой границе

ObjectGetInteger, ObjectSetInteger, ChartScreenShot

ALIGN_RIGHT

Выравнивание по правой границе

ObjectGetInteger, ObjectSetInteger, ChartScreenShot

ANCHOR_BOTTOM

Точка привязки для стрелки находится внизу

ObjectGetInteger, ObjectSetInteger

ANCHOR_CENTER

Точка привязки строго по центру объекта

ObjectGetInteger, ObjectSetInteger

ANCHOR_LEFT

Точка привязки слева по центру

ObjectGetInteger, ObjectSetInteger

ANCHOR_LEFT_LOWER

Точка привязки в левом нижнем углу

ObjectGetInteger, ObjectSetInteger

ANCHOR_LEFT_UPPER

Точка привязки в левом верхнем углу

ObjectGetInteger, ObjectSetInteger

ANCHOR_LOWER

Точка привязки снизу по центру

ObjectGetInteger, ObjectSetInteger

ANCHOR_RIGHT

Точка привязки справа по центру

ObjectGetInteger, ObjectSetInteger

ANCHOR_RIGHT_LOWER

Точка привязки в правом нижнем углу

ObjectGetInteger, ObjectSetInteger

ANCHOR_RIGHT_UPPER

Точка привязки в правом верхнем углу

ObjectGetInteger, ObjectSetInteger

ANCHOR_TOP

Точка привязки для стрелки находится сверху

ObjectGetInteger, ObjectSetInteger

ANCHOR_UPPER

Точка привязки сверху по центру

ObjectGetInteger, ObjectSetInteger

BORDER_FLAT

Плоский вид

ObjectGetInteger, ObjectSetInteger

BORDER_RAISED

Выпуклый вид

ObjectGetInteger, ObjectSetInteger

BORDER_SUNKEN

Вогнутый вид

ObjectGetInteger, ObjectSetInteger

CHAR_MAX

Максимальное значение, которое может быть представлено типом char

Константы числовых типов

CHAR_MIN

Минимальное значение, которое может быть представлено типом char

Константы числовых типов

CHART_AUTOSCROLL

Режим автоматического перехода к правому краю графика

ChartSetInteger, ChartGetInteger

CHART_BARS

Отображение в виде баров

ChartSetInteger

CHART_BEGIN

Начало графика (самые старые цены)

ChartNavigate

CHART_BRING_TO_TOP

Показ графика поверх всех других

ChartSetInteger, ChartGetInteger

CHART_CANDLES

Отображение в виде японских свечей

ChartSetInteger

CHART_COLOR_ASK

Цвет линии Ask-цены

ChartSetInteger, ChartGetInteger

CHART_COLOR_BACKGROUND

Цвет фона графика

ChartSetInteger, ChartGetInteger

CHART_COLOR_BID

Цвет линии Bid-цены

ChartSetInteger, ChartGetInteger

CHART_COLOR_CANDLE_BEAR

Цвет тела медвежьей свечи

ChartSetInteger, ChartGetInteger

CHART_COLOR_CANDLE_BULL

Цвет тела бычьей свечи

ChartSetInteger, ChartGetInteger

CHART_COLOR_CHART_DOWN

Цвет бара вниз, тени и окантовки тела медвежьей свечи

ChartSetInteger, ChartGetInteger

CHART_COLOR_CHART_LINE

Цвет линии графика и японских свечей "Доджи"

ChartSetInteger, ChartGetInteger

CHART_COLOR_CHART_UP

Цвет бара вверх, тени и окантовки тела бычьей свечи

ChartSetInteger, ChartGetInteger

CHART_COLOR_FOREGROUND

Цвет осей, шкалы и строки OHLC

ChartSetInteger, ChartGetInteger

CHART_COLOR_GRID

Цвет сетки

ChartSetInteger, ChartGetInteger

CHART_COLOR_LAST

Цвет линии цены последней совершенной сделки (Last)

ChartSetInteger, ChartGetInteger

CHART_COLOR_STOP_LEVEL

Цвет уровней стоп-ордеров (Stop Loss и Take Profit)

ChartSetInteger, ChartGetInteger

CHART_COLOR_VOLUME

Цвет объемов и уровней открытия ордеров

ChartSetInteger, ChartGetInteger

CHART_COMMENT

Текст комментария на графике

ChartSetString, ChartGetString

CHART_CURRENT_POS

Текущая позиция

ChartNavigate

CHART_DRAG_TRADE_LEVELS

Разрешение на перетаскивание торговых уровней на графике с помощью мышки. По умолчанию режим перетаскивания включен (значение true)

ChartSetInteger, ChartGetInteger

CHART_END

Конец графика (самые свежие цены)

ChartNavigate

CHART_EVENT_MOUSE_MOVE

Отправка всем mql4-программам на графике сообщений о событиях перемещения и нажатия кнопок мыши (CHARTEVENT_MOUSE_MOVE)

ChartSetInteger, ChartGetInteger

CHART_EVENT_OBJECT_CREATE

Отправка всем mql4-программам на графике сообщений о событии создания графического объекта (CHARTEVENT_OBJECT_CREATE)

ChartSetInteger, ChartGetInteger

CHART_EVENT_OBJECT_DELETE

Отправка всем mql4-программам на графике сообщений о событии уничтожения графического объекта (CHARTEVENT_OBJECT_DELETE)

ChartSetInteger, ChartGetInteger

CHART_FIRST_VISIBLE_BAR

Номер первого видимого бара на графике. Индексация баров соответствует таймсерии.

ChartSetInteger, ChartGetInteger

CHART_FIXED_MAX

Фиксированный максимум графика

ChartSetDouble, ChartGetDouble

CHART_FIXED_MIN

Фиксированный минимум графика

ChartSetDouble, ChartGetDouble

CHART_FIXED_POSITION

Положение фиксированной позиции графика от левого края в процентах. Фиксированная позиция графика обозначена маленьким серым треугольником на горизонтальной оси времени и показывается только в том случае, если отключена автоматическая прокрутка к правому краю при поступлении нового тика (смотри свойство CHART_AUTOSCROLL). Бар, который находится на фиксированной позиции, остаётся на том же месте при увеличении и уменьшении масштаба.

ChartSetDouble, ChartGetDouble

CHART_FOREGROUND

Ценовой график на переднем плане

ChartSetInteger, ChartGetInteger

CHART_HEIGHT_IN_PIXELS

Высота графика в пикселях

ChartSetInteger, ChartGetInteger

CHART_IS_OFFLINE

Признак, определяющий, является ли график автономным

ChartSetInteger, ChartGetInteger

CHART_LINE

Отображение в виде линии, проведенной по ценам Close

ChartSetInteger

CHART_MODE

Тип графика (свечи, бары или линия)

ChartSetInteger, ChartGetInteger

CHART_MOUSE_SCROLL

Прокрутка графика левой кнопкой мышки по горизонтали. Прокрутка по вертикали также будет доступна, если установлено в true значение любого из трех свойств: CHART_SCALEFIX, CHART_SCALEFIX_11 или CHART_SCALE_PT_PER_BAR

ChartSetInteger, ChartGetInteger

CHART_POINTS_PER_BAR

Значение масштаба в пунктах на бар

ChartSetDouble, ChartGetDouble

CHART_PRICE_MAX

Максимум графика

ChartSetDouble, ChartGetDouble

CHART_PRICE_MIN

Минимум графика

ChartSetDouble, ChartGetDouble

CHART_SCALE

Масштаб

ChartSetInteger, ChartGetInteger

CHART_SCALE_PT_PER_BAR

Режим указания масштаба в пунктах на бар

ChartSetInteger, ChartGetInteger

CHART_SCALEFIX

Режим фиксированного масштаба

ChartSetInteger, ChartGetInteger

CHART_SCALEFIX_11

Режим масштаба 1:1

ChartSetInteger, ChartGetInteger

CHART_SHIFT

Режим отступа ценового графика от правого края

ChartSetInteger, ChartGetInteger

CHART_SHIFT_SIZE

Размер отступа нулевого бара от правого края в процентах

ChartSetDouble, ChartGetDouble

CHART_SHOW_ASK_LINE

Отображение значения Ask горизонтальной линией на графике

ChartSetInteger, ChartGetInteger

CHART_SHOW_BID_LINE

Отображение значения Bid горизонтальной линией на графике

ChartSetInteger, ChartGetInteger

CHART_SHOW_DATE_SCALE

Отображение на графике шкалы времени

ChartSetInteger, ChartGetInteger

CHART_SHOW_GRID

Отображение сетки на графике

ChartSetInteger, ChartGetInteger

CHART_SHOW_LAST_LINE

Отображение значения Last горизонтальной линией на графике

ChartSetInteger, ChartGetInteger

CHART_SHOW_OBJECT_DESCR

Всплывающие описания графических объектов

ChartSetInteger, ChartGetInteger

CHART_SHOW_OHLC

Отображение в левом верхнем углу значений OHLC

ChartSetInteger, ChartGetInteger

CHART_SHOW_PERIOD_SEP

Отображение вертикальных разделителей между соседними периодами

ChartSetInteger, ChartGetInteger

CHART_SHOW_PRICE_SCALE

Отображение на графике ценовой шкалы

ChartSetInteger, ChartGetInteger

CHART_SHOW_TRADE_LEVELS

Отображение на графике торговых уровней (уровни открытых ордеров, Stop Loss, Take Profit и отложенных ордеров)

ChartSetInteger, ChartGetInteger

CHART_SHOW_VOLUMES

Отображение объемов на графике

ChartSetInteger, ChartGetInteger

CHART_VISIBLE_BARS

Количество баров на графике, доступных для отображения

ChartSetInteger, ChartGetInteger

CHART_VOLUME_HIDE

Объемы не показаны

ChartSetInteger

CHART_VOLUME_TICK

Тиковые объемы

ChartSetInteger

CHART_WIDTH_IN_BARS

Ширина графика в барах

ChartSetInteger, ChartGetInteger

CHART_WIDTH_IN_PIXELS

Ширина графика в пикселях

ChartSetInteger, ChartGetInteger

CHART_WINDOW_HANDLE

Хэндл графика (HWND)

ChartSetInteger, ChartGetInteger

CHART_WINDOW_IS_VISIBLE

Видимость подокон

ChartSetInteger, ChartGetInteger

CHART_WINDOW_YDISTANCE

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

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

ChartSetInteger, ChartGetInteger

CHART_WINDOWS_TOTAL

Общее количество окон графика, включая подокна индикаторов

ChartSetInteger, ChartGetInteger

CHARTEVENT_CHART_CHANGE

Изменение размеров графика или изменение свойств графика через диалог свойств

OnChartEvent

CHARTEVENT_CLICK

Нажатие мышки на графике

OnChartEvent

CHARTEVENT_CUSTOM

Начальный номер события из диапазона пользовательских событий

OnChartEvent

CHARTEVENT_CUSTOM_LAST

Конечный номер события из диапазона пользовательских событий

OnChartEvent

CHARTEVENT_KEYDOWN

Нажатие клавиатуры

OnChartEvent

CHARTEVENT_MOUSE_MOVE

Перемещение мыши и нажатие кнопок мыши (если для графика установлено свойство CHART_EVENT_MOUSE_MOVE=true)

OnChartEvent

CHARTEVENT_OBJECT_CHANGE

Изменение свойств графического объекта через диалог свойств

OnChartEvent

CHARTEVENT_OBJECT_CLICK

Нажатие мышки на графическом объекте

OnChartEvent

CHARTEVENT_OBJECT_CREATE

Создание графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_CREATE=true)

OnChartEvent

CHARTEVENT_OBJECT_DELETE

Удаление графического объекта (если для графика установлено свойство CHART_EVENT_OBJECT_DELETE=true)

OnChartEvent

CHARTEVENT_OBJECT_DRAG

Перетаскивание графического объекта

OnChartEvent

CHARTEVENT_OBJECT_ENDEDIT

Окончание редактирования текста в графическом объекте Edit

OnChartEvent

CHARTS_MAX

Максимально возможное количество одновременно открытых графиков в терминале

Прочие константы

CLR_NONE, clrNONE

Отсутствие цвета. Значение по умолчанию, указатель пустого значения. Используется в пользовательских индикаторах

Прочие константы

clrAliceBlue

Alice Blue

Набор Web-цветов

clrAntiqueWhite

Antique White

Набор Web-цветов

clrAqua

Aqua

Набор Web-цветов

clrAquamarine

Aquamarine

Набор Web-цветов

clrBeige

Beige

Набор Web-цветов

clrBisque

Bisque

Набор Web-цветов

clrBlack

Black

Набор Web-цветов

clrBlanchedAlmond

Blanched Almond

Набор Web-цветов

clrBlue

Blue

Набор Web-цветов

clrBlueViolet

Blue Violet

Набор Web-цветов

clrBrown

Brown

Набор Web-цветов

clrBurlyWood

Burly Wood

Набор Web-цветов

clrCadetBlue

Cadet Blue

Набор Web-цветов

clrChartreuse

Chartreuse

Набор Web-цветов

clrChocolate

Chocolate

Набор Web-цветов

clrCoral

Coral

Набор Web-цветов

clrCornflowerBlue

Cornflower Blue

Набор Web-цветов

clrCornsilk

Cornsilk

Набор Web-цветов

clrCrimson

Crimson

Набор Web-цветов

clrDarkBlue

Dark Blue

Набор Web-цветов

clrDarkGoldenrod

Dark Goldenrod

Набор Web-цветов

clrDarkGray

Dark Gray

Набор Web-цветов

clrDarkGreen

Dark Green

Набор Web-цветов

clrDarkKhaki

Dark Khaki

Набор Web-цветов

clrDarkOliveGreen

Dark Olive Green

Набор Web-цветов

clrDarkOrange

Dark Orange

Набор Web-цветов

clrDarkOrchid

Dark Orchid

Набор Web-цветов

clrDarkSalmon

Dark Salmon

Набор Web-цветов

clrDarkSeaGreen

Dark Sea Green

Набор Web-цветов

clrDarkSlateBlue

Dark Slate Blue

Набор Web-цветов

clrDarkSlateGray

Dark Slate Gray

Набор Web-цветов

clrDarkTurquoise

Dark Turquoise

Набор Web-цветов

clrDarkViolet

Dark Violet

Набор Web-цветов

clrDeepPink

Deep Pink

Набор Web-цветов

clrDeepSkyBlue

Deep Sky Blue

Набор Web-цветов

clrDimGray

Dim Gray

Набор Web-цветов

clrDodgerBlue

Dodger Blue

Набор Web-цветов

clrFireBrick

Fire Brick

Набор Web-цветов

clrForestGreen

Forest Green

Набор Web-цветов

clrGainsboro

Gainsboro

Набор Web-цветов

clrGold

Gold

Набор Web-цветов

clrGoldenrod

Goldenrod

Набор Web-цветов

clrGray

Gray

Набор Web-цветов

clrGreen

Green

Набор Web-цветов

clrGreenYellow

Green Yellow

Набор Web-цветов

clrHoneydew

Honeydew

Набор Web-цветов

clrHotPink

Hot Pink

Набор Web-цветов

clrIndianRed

Indian Red

Набор Web-цветов

clrIndigo

Indigo

Набор Web-цветов

clrIvory

Ivory

Набор Web-цветов

clrKhaki

Khaki

Набор Web-цветов

clrLavender

Lavender

Набор Web-цветов

clrLavenderBlush

Lavender Blush

Набор Web-цветов

clrLawnGreen

Lawn Green

Набор Web-цветов

clrLemonChiffon

Lemon Chiffon

Набор Web-цветов

clrLightBlue

Light Blue

Набор Web-цветов

clrLightCoral

Light Coral

Набор Web-цветов

clrLightCyan

Light Cyan

Набор Web-цветов

clrLightGoldenrod

Light Goldenrod

Набор Web-цветов

clrLightGray

Light Gray

Набор Web-цветов

clrLightGreen

Light Green

Набор Web-цветов

clrLightPink

Light Pink

Набор Web-цветов

clrLightSalmon

Light Salmon

Набор Web-цветов

clrLightSeaGreen

Light Sea Green

Набор Web-цветов

clrLightSkyBlue

Light Sky Blue

Набор Web-цветов

clrLightSlateGray

Light Slate Gray

Набор Web-цветов

clrLightSteelBlue

Light Steel Blue

Набор Web-цветов

clrLightYellow

Light Yellow

Набор Web-цветов

clrLime

Lime

Набор Web-цветов

clrLimeGreen

Lime Green

Набор Web-цветов

clrLinen

Linen

Набор Web-цветов

clrMagenta

Magenta

Набор Web-цветов

clrMaroon

Maroon

Набор Web-цветов

clrMediumAquamarine

Medium Aquamarine

Набор Web-цветов

clrMediumBlue

Medium Blue

Набор Web-цветов

clrMediumOrchid

Medium Orchid

Набор Web-цветов

clrMediumPurple

Medium Purple

Набор Web-цветов

clrMediumSeaGreen

Medium Sea Green

Набор Web-цветов

clrMediumSlateBlue

Medium Slate Blue

Набор Web-цветов

clrMediumSpringGreen

Medium Spring Green

Набор Web-цветов

clrMediumTurquoise

Medium Turquoise

Набор Web-цветов

clrMediumVioletRed

Medium Violet Red

Набор Web-цветов

clrMidnightBlue

Midnight Blue

Набор Web-цветов

clrMintCream

Mint Cream

Набор Web-цветов

clrMistyRose

Misty Rose

Набор Web-цветов

clrMoccasin

Moccasin

Набор Web-цветов

clrNavajoWhite

Navajo White

Набор Web-цветов

clrNavy

Navy

Набор Web-цветов

clrOldLace

Old Lace

Набор Web-цветов

clrOlive

Olive

Набор Web-цветов

clrOliveDrab

Olive Drab

Набор Web-цветов

clrOrange

Orange

Набор Web-цветов

clrOrangeRed

Orange Red

Набор Web-цветов

clrOrchid

Orchid

Набор Web-цветов

clrPaleGoldenrod

Pale Goldenrod

Набор Web-цветов

clrPaleGreen

Pale Green

Набор Web-цветов

clrPaleTurquoise

Pale Turquoise

Набор Web-цветов

clrPaleVioletRed

Pale Violet Red

Набор Web-цветов

clrPapayaWhip

Papaya Whip

Набор Web-цветов

clrPeachPuff

Peach Puff

Набор Web-цветов

clrPeru

Peru

Набор Web-цветов

clrPink

Pink

Набор Web-цветов

clrPlum

Plum

Набор Web-цветов

clrPowderBlue

Powder Blue

Набор Web-цветов

clrPurple

Purple

Набор Web-цветов

clrRed

Red

Набор Web-цветов

clrRosyBrown

Rosy Brown

Набор Web-цветов

clrRoyalBlue

Royal Blue

Набор Web-цветов

clrSaddleBrown

Saddle Brown

Набор Web-цветов

clrSalmon

Salmon

Набор Web-цветов

clrSandyBrown

Sandy Brown

Набор Web-цветов

clrSeaGreen

Sea Green

Набор Web-цветов

clrSeashell

Seashell

Набор Web-цветов

clrSienna

Sienna

Набор Web-цветов

clrSilver

Silver

Набор Web-цветов

clrSkyBlue

Sky Blue

Набор Web-цветов

clrSlateBlue

Slate Blue

Набор Web-цветов

clrSlateGray

Slate Gray

Набор Web-цветов

clrSnow

Snow

Набор Web-цветов

clrSpringGreen

Spring Green

Набор Web-цветов

clrSteelBlue

Steel Blue

Набор Web-цветов

clrTan

Tan

Набор Web-цветов

clrTeal

Teal

Набор Web-цветов

clrThistle

Thistle

Набор Web-цветов

clrTomato

Tomato

Набор Web-цветов

clrTurquoise

Turquoise

Набор Web-цветов

clrViolet

Violet

Набор Web-цветов

clrWheat

Wheat

Набор Web-цветов

clrWhite

White

Набор Web-цветов

clrWhiteSmoke

White Smoke

Набор Web-цветов

clrYellow

Yellow

Набор Web-цветов

clrYellowGreen

Yellow Green

Набор Web-цветов

CORNER_LEFT_LOWER

Центр координат в левом нижнем углу графика

ObjectGetInteger, ObjectSetInteger

CORNER_LEFT_UPPER

Центр координат в левом верхнем углу графика

ObjectGetInteger, ObjectSetInteger

CORNER_RIGHT_LOWER

Центр координат в правом нижнем углу графика

ObjectGetInteger, ObjectSetInteger

CORNER_RIGHT_UPPER

Центр координат в правом верхнем углу графика

ObjectGetInteger, ObjectSetInteger

CP_ACP

Текущая кодовая страница ANSI кодировка в операционной системе Windows

CharArrayToString, StringToCharArray, FileOpen

CP_MACCP

Текущая кодовая страница Macintosh.

Примечание: Это значение преимущественно используется в ранее созданных программных кодах и теперь в нем нет необходимости, так как современные компьютеры Macintosh используют Unicode кодировку.

CharArrayToString, StringToCharArray, FileOpen

CP_OEMCP

Текущая кодовая страница OEM.

CharArrayToString, StringToCharArray, FileOpen

CP_SYMBOL

Кодовая страница Symbol

CharArrayToString, StringToCharArray, FileOpen

CP_THREAD_ACP

Кодировка Windows ANSI для текущего потока выполнения.

CharArrayToString, StringToCharArray, FileOpen

CP_UTF7

Кодовая страница UTF-7.

CharArrayToString, StringToCharArray, FileOpen

CP_UTF8

Кодовая страница UTF-8.

CharArrayToString, StringToCharArray, FileOpen

CRYPT_AES128

Шифрование AES с ключом 128 бит (16 байт)

CryptEncode, CryptDecode

CRYPT_AES256

Шифрование AES с ключом 256 бит (32 байта)

CryptEncode, CryptDecode

CRYPT_ARCH_ZIP

ZIP архивирование

CryptEncode, CryptDecode

CRYPT_BASE64

Шифрование BASE64 (перекодировка)

CryptEncode, CryptDecode

CRYPT_DES

Шифрование DES с ключом 56 бит (7 байт)

CryptEncode, CryptDecode

CRYPT_HASH_MD5

Расчёт HASH MD5

CryptEncode, CryptDecode

CRYPT_HASH_SHA1

Расчёт HASH SHA1

CryptEncode, CryptDecode

CRYPT_HASH_SHA256

Расчёт HASH SHA256

CryptEncode, CryptDecode

DBL_DIG

Количество значимых десятичных знаков

Константы числовых типов

DBL_EPSILON

Наименьшее число для которого выполняется условие 1.0+DBL_EPSILON != 1.0

Константы числовых типов

DBL_MANT_DIG

Количество битов в мантиссе

Константы числовых типов

DBL_MAX

Максимальное значение, которое может быть представлено типом double

Константы числовых типов

DBL_MAX_10_EXP

Максимальное десятичное значение степени экспоненты

Константы числовых типов

DBL_MAX_EXP

Максимальное двоичное значение степени экспоненты

Константы числовых типов

DBL_MIN

Минимальное положительное значение, которое может быть представлено типом double

Константы числовых типов

DBL_MIN_10_EXP

Минимальное десятичное значение степени экспоненты

Константы числовых типов

DBL_MIN_EXP

Минимальное двоичное значение степени экспоненты

Константы числовых типов

DRAW_ARROW

Стрелки (символы)

Стили рисования

DRAW_HISTOGRAM

Гистограмма

Стили рисования

DRAW_LINE

Простая линия

Стили рисования

DRAW_NONE

Отсутствие какого-либо рисования

Стили рисования

DRAW_SECTION

Отрезки между непустыми значениями линии

Стили рисования

DRAW_ZIGZAG

Отрезки между непустыми значениями чётной и нечётной линий (зигзаг), 2 буфера значений

Стили рисования

EMPTY

Указывает пустое состояние параметра

Прочие константы

EMPTY_VALUE

Пустое значение в индикаторном буфере

Прочие константы

ERR_ACCOUNT_DISABLED

Счет заблокирован

GetLastError

ERR_ARRAY_AS_PARAMETER_EXPECTED

В качестве параметра ожидается массив

GetLastError

ERR_ARRAY_INDEX_OUT_OF_RANGE

Индекс массива - вне диапазона

GetLastError

ERR_ARRAY_INVALID

Неверный массив

GetLastError

ERR_BROKER_BUSY

Брокер занят

GetLastError

ERR_CANNOT_CALL_FUNCTION

Невозможно вызвать функцию

GetLastError

ERR_CANNOT_LOAD_LIBRARY

Невозможно загрузить библиотеку

GetLastError

ERR_CANNOT_OPEN_FILE

Невозможно открыть файл

GetLastError

ERR_CHART_NOREPLY

График не отвечает

GetLastError

ERR_CHART_NOT_FOUND

График не найден

GetLastError

ERR_CHART_PROP_INVALID

Неизвестное свойство графика

GetLastError

ERR_CHARTINDICATOR_NOT_FOUND

Индикатор не найден

GetLastError

ERR_CHARTWINDOW_NOT_FOUND

Не найдено подокно графика

GetLastError

ERR_COMMON_ERROR

Общая ошибка

GetLastError

ERR_CUSTOM_INDICATOR_ERROR

Ошибка пользовательского индикатора

GetLastError

ERR_DLL_CALLS_NOT_ALLOWED

Вызовы DLL не разрешены

GetLastError

ERR_DLLFUNC_CRITICALERROR

Критическая ошибка вызова DLL-функции

GetLastError

ERR_DOUBLE_PARAMETER_EXPECTED

Ожидается параметр типа double

GetLastError

ERR_END_OF_FILE

Конец файла

GetLastError

ERR_EXTERNAL_CALLS_NOT_ALLOWED

Вызовы внешних библиотечных функций не разрешены

GetLastError

ERR_FILE_ARRAYRESIZE_ERROR

Ошибка изменения размера массива

GetLastError

ERR_FILE_BIN_STRINGSIZE

Размер строки должен быть указан для двоичных файлов

GetLastError

ERR_FILE_BUFFER_ALLOCATION_ERROR

Ошибка размещения буфера текстового файла

GetLastError

ERR_FILE_CANNOT_CLEAN_DIRECTORY

Ошибка очистки директории

GetLastError

ERR_FILE_CANNOT_DELETE

Ошибка удаления файла

GetLastError

ERR_FILE_CANNOT_DELETE_DIRECTORY

Ошибка удаления директории

GetLastError

ERR_FILE_CANNOT_OPEN

Ошибка открытия файла

GetLastError

ERR_FILE_CANNOT_REWRITE

Файл не может быть перезаписан

GetLastError

ERR_FILE_DIRECTORY_NOT_EXIST

Директория не существует

GetLastError

ERR_FILE_INCOMPATIBLE

Неверный тип файла (для строковых массивов-TXT, для всех других-BIN)

GetLastError

ERR_FILE_INVALID_HANDLE

Неверный хендл файла (файл закрыт или не был открыт)

GetLastError

ERR_FILE_IS_DIRECTORY

Файл является директорией

GetLastError

ERR_FILE_NOT_BIN

Файл должен быть открыт с флагом FILE_BIN

GetLastError

ERR_FILE_NOT_CSV

Файл должен быть открыт с флагом FILE_CSV

GetLastError

ERR_FILE_NOT_DIRECTORY

Указанный файл не является директорией

GetLastError

ERR_FILE_NOT_EXIST

Файл не существует

GetLastError

ERR_FILE_NOT_TOREAD

Файл должен быть открыт с флагом FILE_READ

GetLastError

ERR_FILE_NOT_TOWRITE

Файл должен быть открыт с флагом FILE_WRITE

GetLastError

ERR_FILE_NOT_TXT

Файл должен быть открыт с флагом FILE_TXT

GetLastError

ERR_FILE_NOT_TXTORCSV

Файл должен быть открыт с флагом FILE_TXT или FILE_CSV

GetLastError

ERR_FILE_READ_ERROR

Ошибка чтения файла

GetLastError

ERR_FILE_STRINGRESIZE_ERROR

Ошибка изменения размера строки

GetLastError

ERR_FILE_STRUCT_WITH_OBJECTS

Структура содержит строки или динамические массивы

GetLastError

ERR_FILE_TOO_LONG_FILENAME

Слишком длинное имя файла

GetLastError

ERR_FILE_TOO_MANY_OPENED

Слишком много открытых файлов

GetLastError

ERR_FILE_WRITE_ERROR

Ошибка записи файла

GetLastError

ERR_FILE_WRONG_DIRECTORYNAME

Неверное имя директории

GetLastError

ERR_FILE_WRONG_FILENAME

Неверное имя файла

GetLastError

ERR_FILE_WRONG_HANDLE

Неверный хендл файла (индекс хендла отсутствует в таблице)

GetLastError

ERR_FORMAT_TOO_MANY_FORMATTERS

Слишком много параметров форматирования строки

GetLastError

ERR_FORMAT_TOO_MANY_PARAMETERS

Число параметров превышает число параметров форматирования строки

GetLastError

ERR_FUNC_NOT_ALLOWED_IN_TESTING

Функция не разрешена в тестовом режиме

GetLastError

ERR_FUNCTION_NOT_CONFIRMED

Функция не разрешена

GetLastError

ERR_GLOBAL_VARIABLE_NOT_FOUND

Глобальная переменная не обнаружена

GetLastError

ERR_GLOBAL_VARIABLES_PROCESSING

Ошибка обработки глобальных переменных

GetLastError

ERR_HISTORY_WILL_UPDATED

Запрошенные исторические данные в состоянии обновления

GetLastError

ERR_INCOMPATIBLE_ARRAYS

Массивы несовместимы

GetLastError

ERR_INCOMPATIBLE_FILEACCESS

Несовместимый режим доступа к файлу

GetLastError

ERR_INCORRECT_SERIESARRAY_USING

Неправильное использование массива-таймсерии

GetLastError

ERR_INDICATOR_CANNOT_INIT

Ошибка инициализации пользовательского индикатора

GetLastError

ERR_INDICATOR_CANNOT_LOAD

Ошибка загрузки пользовательского индикатора

GetLastError

ERR_INTEGER_PARAMETER_EXPECTED

Ожидается параметр типа integer

GetLastError

ERR_INTERNAL_ERROR

Внутренняя ошибка

GetLastError

ERR_INVALID_ACCOUNT

Неправильный номер счета

GetLastError

ERR_INVALID_FUNCTION_PARAMSCNT

Неправильное количество параметров функции

GetLastError

ERR_INVALID_FUNCTION_PARAMVALUE

Недопустимое значение параметра функции

GetLastError

ERR_INVALID_POINTER

Неверный указатель

GetLastError

ERR_INVALID_PRICE

Неправильная цена

GetLastError

ERR_INVALID_PRICE_PARAM

Неправильный параметр цены для торговой функции

GetLastError

ERR_INVALID_STOPS

Неправильные стопы

GetLastError

ERR_INVALID_TICKET

Неверный номер тикета

GetLastError

ERR_INVALID_TRADE_PARAMETERS

Неправильные параметры

GetLastError

ERR_INVALID_TRADE_VOLUME

Неправильный объем

GetLastError

ERR_LONG_POSITIONS_ONLY_ALLOWED

Разрешена только покупка

GetLastError

ERR_LONGS_NOT_ALLOWED

Ордера на покупку не разрешены. Необходимо проверить свойства эксперта

GetLastError

ERR_MALFUNCTIONAL_TRADE

Недопустимая операция, нарушающая функционирование сервера

GetLastError

ERR_MARKET_CLOSED

Рынок закрыт

GetLastError

ERR_NO_CONNECTION

Нет связи с торговым сервером

GetLastError

ERR_NO_ERROR

Нет ошибки

GetLastError

ERR_NO_HISTORY_DATA

Нет исторических данных

GetLastError

ERR_NO_MEMORY_FOR_ARRAYSTRING

Нет памяти для строкового массива

GetLastError

ERR_NO_MEMORY_FOR_CALL_STACK

Нет памяти для стека функций

GetLastError

ERR_NO_MEMORY_FOR_HISTORY

Не хватает памяти для исторических данных

GetLastError

ERR_NO_MEMORY_FOR_PARAM_STRING

Нет памяти для строкового параметра

GetLastError

ERR_NO_MEMORY_FOR_RETURNED_STR

Недостаточно памяти для строки, возвращаемой из функции

GetLastError

ERR_NO_MEMORY_FOR_TEMP_STRING

Нет памяти для временной строки

GetLastError

ERR_NO_MQLERROR

Нет ошибки

GetLastError

ERR_NO_OBJECT_NAME

Нет имени объекта

GetLastError

ERR_NO_ORDER_SELECTED

Ни один ордер не выбран

GetLastError

ERR_NO_RESULT

Нет ошибки, но результат неизвестен

GetLastError

ERR_NO_SPECIFIED_SUBWINDOW

Не найдено указанное подокно

GetLastError

ERR_NOT_ENOUGH_MONEY

Недостаточно денег для совершения операции

GetLastError

ERR_NOT_ENOUGH_RIGHTS

Недостаточно прав

GetLastError

ERR_NOT_ENOUGH_STACK_FOR_PARAM

На стеке нет памяти для передачи параметров

GetLastError

ERR_NOT_INITIALIZED_ARRAY

Неинициализированный массив

GetLastError

ERR_NOT_INITIALIZED_ARRAYSTRING

Неинициализированная строка в массиве

GetLastError

ERR_NOT_INITIALIZED_STRING

Неинициализированная строка

GetLastError

ERR_NOTIFICATION_ERROR

Ошибка отправки push-уведомления

GetLastError

ERR_NOTIFICATION_PARAMETER

Ошибка параметров push-уведомления

GetLastError

ERR_NOTIFICATION_SETTINGS

Уведомления запрещены

GetLastError

ERR_NOTIFICATION_TOO_FREQUENT

Слишком частые запросы отсылки push-уведомлений

GetLastError

ERR_OBJECT_ALREADY_EXISTS

Объект уже существует

GetLastError

ERR_OBJECT_COORDINATES_ERROR

Ошибка координат объекта

GetLastError

ERR_OBJECT_DOES_NOT_EXIST

Объект не существует

GetLastError

ERR_OFF_QUOTES

Нет цен

GetLastError

ERR_OLD_VERSION

Старая версия клиентского терминала

GetLastError

ERR_ORDER_LOCKED

Ордер заблокирован и уже обрабатывается

GetLastError

ERR_OUT_OF_MEMORY

Нет памяти

GetLastError

ERR_PRICE_CHANGED

Цена изменилась

GetLastError

ERR_RECURSIVE_STACK_OVERFLOW

Переполнение стека после рекурсивного вызова

GetLastError

ERR_REMAINDER_FROM_ZERO_DIVIDE

Остаток от деления на ноль

GetLastError

ERR_REQUOTE

Новые цены

GetLastError

ERR_RESOURCE_DUPLICATED

Дубликат ресурса

GetLastError

ERR_RESOURCE_NOT_FOUND

Ресурс не найден

GetLastError

ERR_RESOURCE_NOT_SUPPORTED

Ресурс не поддерживается

GetLastError

ERR_SEND_MAIL_ERROR

Ошибка отправки почты

GetLastError

ERR_SERVER_BUSY

Торговый сервер занят

GetLastError

ERR_SHORTS_NOT_ALLOWED

Ордера на продажу не разрешены. Необходимо проверить свойства эксперта

GetLastError

ERR_SOME_ARRAY_ERROR

Ошибка массива

GetLastError

ERR_SOME_FILE_ERROR

Ошибка при работе с файлом

GetLastError

ERR_SOME_OBJECT_ERROR

Ошибка при работе с объектом

GetLastError

ERR_STRING_FUNCTION_INTERNAL

Внутренняя ошибка строковой функции

GetLastError

ERR_STRING_PARAMETER_EXPECTED

Ожидается параметр типа string

GetLastError

ERR_SYMBOL_SELECT

Ошибка выбора инструмента

GetLastError

ERR_SYSTEM_BUSY

Система занята

GetLastError

ERR_TOO_FREQUENT_REQUESTS

Слишком частые запросы

GetLastError

ERR_TOO_LONG_STRING

Слишком длинная строка

GetLastError

ERR_TOO_MANY_OPENED_FILES

Слишком много открытых файлов

GetLastError

ERR_TOO_MANY_REQUESTS

Слишком много запросов

GetLastError

ERR_TRADE_CONTEXT_BUSY

Подсистема торговли занята

GetLastError

ERR_TRADE_DISABLED

Торговля запрещена

GetLastError

ERR_TRADE_ERROR

Ошибка при выполнении торговой операции

GetLastError

ERR_TRADE_EXPERT_DISABLED_BY_SERVER

Автоматическая торговля с помощью экспертов/скриптов запрещена на стороне сервера

GetLastError

ERR_TRADE_EXPIRATION_DENIED

Использование даты истечения ордера запрещено брокером

GetLastError

ERR_TRADE_HEDGE_PROHIBITED

Попытка открыть противоположный ордер в случае, если хеджирование запрещено

GetLastError

ERR_TRADE_MODIFY_DENIED

Модификация запрещена, так как ордер слишком близок к рынку

GetLastError

ERR_TRADE_NOT_ALLOWED

Торговля не разрешена. Необходимо включить опцию "Разрешить советнику торговать" в свойствах эксперта

GetLastError

ERR_TRADE_PROHIBITED_BY_FIFO

Попытка закрыть позицию по инструменту в противоречии с правилом FIFO

GetLastError

ERR_TRADE_TIMEOUT

Истек срок ожидания совершения сделки

GetLastError

ERR_TRADE_TOO_MANY_ORDERS

Количество открытых и отложенных ордеров достигло предела, установленного брокером

GetLastError

ERR_UNKNOWN_COMMAND

Неизвестная команда

GetLastError

ERR_UNKNOWN_OBJECT_PROPERTY

Запрошено неизвестное свойство объекта

GetLastError

ERR_UNKNOWN_OBJECT_TYPE

Неизвестный тип объекта

GetLastError

ERR_UNKNOWN_SYMBOL

Неизвестный символ

GetLastError

ERR_USER_ERROR_FIRST

С этого кода начинаются ошибки, задаваемые пользователем

GetLastError

ERR_WEBREQUEST_CONNECT_FAILED

Не удалось подключиться к указанному URL

GetLastError

ERR_WEBREQUEST_INVALID_ADDRESS

URL не прошел проверку

GetLastError

ERR_WEBREQUEST_REQUEST_FAILED

Ошибка в результате выполнения HTTP запроса

GetLastError

ERR_WEBREQUEST_TIMEOUT

Превышен таймаут получения данных

GetLastError

ERR_WRONG_FILE_NAME

Неправильное имя файла

GetLastError

ERR_WRONG_FUNCTION_POINTER

Неправильный указатель функции

GetLastError

ERR_WRONG_JUMP

Неправильный переход

GetLastError

ERR_ZERO_DIVIDE

Деление на ноль

GetLastError

FILE_ACCESS_DATE

Дата последнего доступа к файлу

FileGetInteger

FILE_ANSI

Строки типа ANSI (однобайтовые символы). Флаг используется при открытии файлов (FileOpen())

FileOpen

FILE_BIN

Двоичный режим чтения-записи (без преобразования из строки и в строку). Флаг используется при открытии файлов (FileOpen())

FileOpen

FILE_COMMON

Расположение файла в общей папке всех клиентских терминалов \Terminal\Common\Files. Флаг используется при открытии файлов (FileOpen()), копировании файлов (FileCopy(), FileMove()) и проверке существования файлов (FileIsExist())

FileOpen, FileCopy, FileMove, FileIsExist

FILE_CREATE_DATE

Дата создания

FileGetInteger

FILE_CSV

Файл типа csv (все записанные элементы преобразуются к строкам соответствующего типа, unicode или ansi, и разделяются разделителем). Флаг используется при открытии файлов (FileOpen())

FileOpen

FILE_END

Получение признака конца файла

FileGetInteger

FILE_EXISTS

Проверка на существование

FileGetInteger

FILE_IS_ANSI

Файл открыт как ANSI (смотри FILE_ANSI)

FileGetInteger

FILE_IS_BINARY

Файл открыт как бинарный (смотри FILE_BIN)

FileGetInteger

FILE_IS_COMMON

Файл открыт в общей папке всех клиентских терминалов (смотри FILE_COMMON)

FileGetInteger

FILE_IS_CSV

Файл открыт как CSV (смотри FILE_CSV)

FileGetInteger

FILE_IS_READABLE

Файл открыт с возможностью чтения (смотри FILE_READ)

FileGetInteger

FILE_IS_TEXT

Файл открыт как текстовый (смотри FILE_TXT)

FileGetInteger

FILE_IS_WRITABLE

Файл открыт с возможностью записи (смотри FILE_WRITE)

FileGetInteger

FILE_LINE_END

Получение признака конца строки

FileGetInteger

FILE_MODIFY_DATE

Дата последнего изменения

FileGetInteger

FILE_POSITION

Позиция указателя в файле

FileGetInteger

FILE_READ

Файл открывается для чтения. Флаг используется при открытии файлов (FileOpen()). При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ

FileOpen

FILE_REWRITE

Возможность перезаписывания файла функциями FileCopy() и FileMove(). Файл должен существовать или открываться для записи. В противном случае файл открыт не будет

FileCopy, FileMove

FILE_SHARE_READ

Совместный доступ по чтению со стороны нескольких программ. Флаг используется при открытии файлов (FileOpen()), но не заменяет при открытии файла необходимости указать FILE_WRITE и/или флаг FILE_READ

FileOpen

FILE_SHARE_WRITE

Совместный доступ по записи со стороны нескольких программ. Флаг используется при открытии файлов (FileOpen()), но не заменяет при открытии файла необходимости указать FILE_WRITE и/или флаг FILE_READ

FileOpen

FILE_SIZE

Размер файла в байтах

FileGetInteger

FILE_TXT

Простой текстовый файл (тот же csv, однако разделитель не принимается во внимание). Флаг используется при открытии файлов (FileOpen())

FileOpen

FILE_UNICODE

Строки типа UNICODE (двухбайтовые символы). Флаг используется при открытии файлов (FileOpen())

FileOpen

FILE_WRITE

Файл открывается для записи. Флаг используется при открытии файлов (FileOpen()). При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ

FileOpen

FLT_DIG

Количество значимых десятичных знаков

Константы числовых типов

FLT_EPSILON

Наименьшее число для которого выполняется условие 1.0+FLT_EPSILON != 1.0

Константы числовых типов

FLT_MANT_DIG

Количество битов в мантиссе

Константы числовых типов

FLT_MAX

Максимальное значение, которое может быть представлено типом float

Константы числовых типов

FLT_MAX_10_EXP

Максимальное десятичное значение степени экспоненты

Константы числовых типов

FLT_MAX_EXP

Максимальное двоичное значение степени экспоненты

Константы числовых типов

FLT_MIN

Минимальное положительное значение, которое может быть представлено типом float

Константы числовых типов

FLT_MIN_10_EXP

Минимальное десятичное значение степени экспоненты

Константы числовых типов

FLT_MIN_EXP

Минимальное двоичное значение степени экспоненты

Константы числовых типов

FRIDAY

Пятница

SymbolInfoSessionQuote, SymbolInfoSessionTrade

GANN_DOWN_TREND

Линия соответствует нисходящему тренду

Объекты Ганна

GANN_UP_TREND

Линия соответствует восходящему тренду

Объекты Ганна

IDABORT

Выбрана кнопка Прервать (Abort)

MessageBox

IDCANCEL

Выбрана кнопка Отмена (Cancel)

MessageBox

IDCONTINUE

Выбрана кнопка Продолжить (Continue)

MessageBox

IDIGNORE

Выбрана кнопка Пропустить (Ignore)

MessageBox

IDNO

Выбрана кнопка Нет (No)

MessageBox

IDOK

Выбрана кнопка OK

MessageBox

IDRETRY

Выбрана кнопка Повтор (Retry)

MessageBox

IDTRYAGAIN

Выбрана кнопка Повторить (Try Again)

MessageBox

IDYES

Выбрана кнопка Да (Yes)

MessageBox

INDICATOR_DIGITS

Точность отображения значений индикатора

Свойства пользовательских индикаторов

INDICATOR_HEIGHT

Фиксированная высота собственного окна индикатора (команда препроцессора #property indicator_height)

Свойства пользовательских индикаторов

INDICATOR_LEVELCOLOR

Цвет линии уровня

Свойства пользовательских индикаторов

INDICATOR_LEVELS

Количество уровней на окне индикатора

Свойства пользовательских индикаторов

INDICATOR_LEVELSTYLE

Стиль линии уровня

Свойства пользовательских индикаторов

INDICATOR_LEVELTEXT

Описание уровня

Свойства пользовательских индикаторов

INDICATOR_LEVELVALUE

Значение уровня

Свойства пользовательских индикаторов

INDICATOR_LEVELWIDTH

Толщина линии уровня

Свойства пользовательских индикаторов

INDICATOR_MAXIMUM

Максимум окна индикатора

Свойства пользовательских индикаторов

INDICATOR_MINIMUM

Минимум окна индикатора

Свойства пользовательских индикаторов

INDICATOR_SHORTNAME

Короткое наименование индикатора

Свойства пользовательских индикаторов

INT_MAX

Максимальное значение, которое может быть представлено типом int

Константы числовых типов

INT_MIN

Минимальное значение, которое может быть представлено типом int

Константы числовых типов

INVALID_HANDLE

Некорректный хэндл

Прочие константы

IS_DEBUG_MODE

Признак работы mq5-программы в режиме отладки

Прочие константы

IS_PROFILE_MODE

Признак работы mq5-программы в режиме профилирования

Прочие константы

LONG_MAX

Максимальное значение, которое может быть представлено типом long

Константы числовых типов

LONG_MIN

Минимальное значение, которое может быть представлено типом long

Константы числовых типов

M_1_PI

1/pi

Математические константы

M_2_PI

2/pi

Математические константы

M_2_SQRTPI

2/sqrt(pi)

Математические константы

M_E

e

Математические константы

M_LN10

ln(10)

Математические константы

M_LN2

ln(2)

Математические константы

M_LOG10E

log10(e)

Математические константы

M_LOG2E

log2(e)

Математические константы

M_PI

pi

Математические константы

M_PI_2

pi/2

Математические константы

M_PI_4

pi/4

Математические константы

M_SQRT1_2

1/sqrt(2)

Математические константы

M_SQRT2

sqrt(2)

Математические константы

MB_ABORTRETRYIGNORE

Окно сообщения содержит три кнопки: Abort, Retry и Ignore

MessageBox

MB_CANCELTRYCONTINUE

Окно сообщения содержит три кнопки: Cancel, Try Again, Continue

MessageBox

MB_DEFBUTTON1

Первая кнопка MB_DEFBUTTON1 - кнопка выбрана по умолчанию, если MB_DEFBUTTON2, MB_DEFBUTTON3, или MB_DEFBUTTON4 не определены

MessageBox

MB_DEFBUTTON2

Вторая кнопка - кнопка по умолчанию

MessageBox

MB_DEFBUTTON3

Третья кнопка - кнопка по умолчанию

MessageBox

MB_DEFBUTTON4

Четвертая кнопка - кнопка по умолчанию

MessageBox

MB_ICONEXCLAMATION,

MB_ICONWARNING

Изображение восклицательного знака

MessageBox

MB_ICONINFORMATION,

MB_ICONASTERISK

Изображение, состоящее из строчного знака i в круге

MessageBox

MB_ICONQUESTION

Изображение вопросительного знака

MessageBox

MB_ICONSTOP,

MB_ICONERROR,

MB_ICONHAND

Изображение знака STOP

MessageBox

MB_OK

Окно сообщения содержит одну кнопку: OK. По умолчанию

MessageBox

MB_OKCANCEL

Окно сообщения содержит две кнопки: OK и Cancel

MessageBox

MB_RETRYCANCEL

Окно сообщения содержит две кнопки: Retry и Cancel

MessageBox

MB_YESNO

Окно сообщения содержит две кнопки: Yes и No

MessageBox

MB_YESNOCANCEL

Окно сообщения содержит три кнопки: Yes, No и Cancel

MessageBox

MODE_ASK

Последняя поступившая цена продажи. Для текущего инструмента хранится в предопределенной переменной Ask

MarketInfo

MODE_BID

Последняя поступившая цена предложения. Для текущего инструмента хранится в предопределенной переменной Bid

MarketInfo

MODE_CHIKOUSPAN

Chinkou Span

Линии индикаторов

MODE_CLOSE

Цена закрытия

Идентификаторы таймсерий

MODE_DIGITS

Количество цифр после запятой в цене инструмента. Для текущего инструмента хранится в предопределенной переменной Digits

MarketInfo

MODE_EMA

Экспоненциальное усреднение

Методы скользящих

MODE_EXPIRATION

Календарная дата конца торгов (обычно используется для фьючерсов)

MarketInfo

MODE_FREEZELEVEL

Уровень заморозки ордеров в пунктах. Если цена исполнения находится в пределах, определяемых уровнем заморозки, то ордер не может быть модифицирован, отменен или закрыт.

MarketInfo

MODE_GATORJAW

Линия Jaw (челюсти Аллигатора)

Линии индикаторов

MODE_GATORLIPS

Линия Lips (губы Аллигатора)

Линии индикаторов

MODE_GATORTEETH

Линия Teeth (зубы Аллигатора)

Линии индикаторов

MODE_HIGH

Максимальная цена

Идентификаторы таймсерий

MODE_HISTORY

Ордер выбирается среди закрытых и отмененных ордеров

OrderSelect

MODE_KIJUNSEN

Kijun-sen

Линии индикаторов

MODE_LOTSIZE

Размер контракта в базовой валюте инструмента

MarketInfo

MODE_LOTSTEP

Шаг изменения размера лота

MarketInfo

MODE_LOW

Минимальная цена

Идентификаторы таймсерий

MODE_LOWER

Нижняя линия

Линии индикаторов

MODE_LWMA

Линейно-взвешенное усреднение

Методы скользящих

MODE_MAIN

Основная линия

Линии индикаторов

MODE_MARGINCALCMODE

Способ расчета залоговых средств. 0 - Forex; 1 - CFD; 2 - Futures; 3 - CFD на индексы

MarketInfo

MODE_MARGINHEDGED

Маржа, взимаемая с перекрытых ордеров в расчете на 1 лот

MarketInfo

MODE_MARGININIT

Начальные залоговые требования для 1 лота

MarketInfo

MODE_MARGINMAINTENANCE

Размер залоговых средств для поддержки открытых ордеров в расчете на 1 лот

MarketInfo

MODE_MARGINREQUIRED

Размер свободных средств, необходимых для открытия 1 лота на покупку

MarketInfo

MODE_MAXLOT

Максимальный размер лота

MarketInfo

MODE_MINLOT

Минимальный размер лота

MarketInfo

MODE_MINUSDI

Линия -DI

Линии индикаторов

MODE_OPEN

Цена открытия

Идентификаторы таймсерий

MODE_PLUSDI

Линия +DI

Линии индикаторов

MODE_POINT

Размер пункта в валюте котировки. Для текущего инструмента хранится в предопределенной переменной Point

MarketInfo

MODE_PROFITCALCMODE

Способ расчета прибыли. 0 - Forex; 1 - CFD; 2 - Futures

MarketInfo

MODE_SENKOUSPANA

Senkou Span A

Линии индикаторов

MODE_SENKOUSPANB

Senkou Span B

Линии индикаторов

MODE_SIGNAL

Сигнальная линия

Линии индикаторов

MODE_SMA

Простое усреднение

Методы скользящих

MODE_SMMA

Сглаженное усреднение

Методы скользящих

MODE_SPREAD

Спрэд в пунктах

MarketInfo

MODE_STARTING

Календарная дата начала торгов (обычно используется для фьючерсов)

MarketInfo

MODE_STOPLEVEL

Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах

Нулевое значение MODE_STOPLEVEL означает либо отсутствие ограничения на минимальную дистанцию для стоп-лосса/тейк-профита, либо факт использования торговым сервером внешних механизмов динамического контроля уровней, которые не могут быть транслированы в терминал. Во втором случае GetLastError() может возвращать ошибку 130, так как уровень MODE_STOPLEVEL фактически является "плавающим".

MarketInfo

MODE_SWAPLONG

Размер свопа для ордеров на покупку

MarketInfo

MODE_SWAPSHORT

Размер свопа для ордеров на продажу

MarketInfo

MODE_SWAPTYPE

Метод вычисления свопов. 0 - в пунктах; 1 - в базовой валюте инструмента; 2 - в процентах; 3 - в валюте залоговых средств.

MarketInfo

MODE_TENKANSEN

Tenkan-sen

Линии индикаторов

MODE_TICKSIZE

Минимальный шаг изменения цены инструмента в пунктах

MarketInfo

MODE_TICKVALUE

Размер минимального изменения цены инструмента в валюте депозита

MarketInfo

MODE_TIME

Время открытия бара, используется в функции ArrayCopySeries()

Идентификаторы таймсерий

MODE_TRADEALLOWED

Разрешение торгов по указанному инструменту

MarketInfo

MODE_TRADES

Ордер выбирается среди открытых и отложенных ордеров

OrderSelect

MODE_UPPER

Верхняя линия

Линии индикаторов

MODE_VOLUME

Объем (количество тиков, сформировавших бар), используется в функциях iLowest() и iHighest()

Идентификаторы таймсерий

MONDAY

Понедельник

SymbolInfoSessionQuote, SymbolInfoSessionTrade

MQL_CODEPAGE

Кодовая страница, используемая в MQL4 программе для вывода и конвертации строк (Print, PrintFormat, Alert, MessageBox, SendFTP, SendMail, SendNotification и т.д.)

Информация о запущенной MQL4-программе

MQL_DEBUG

Признак работы запущенной программы в режиме отладки

MQLInfoInteger

MQL_DLLS_ALLOWED

Разрешение на использование DLL для данной запущенной программы

MQLInfoInteger

MQL_LICENSE_TYPE

Тип лицензии модуля EX4. Лицензия относится именно к тому модулю EX4, из которого делается запрос с помощью MQLInfoInteger(MQL_LICENSE_TYPE).

MQLInfoInteger

MQL_OPTIMIZATION

Признак работы запущенной программы в процессе оптимизации

MQLInfoInteger

MQL_PROFILER

Признак работы запущенной программы в режиме профилирования кода

MQLInfoInteger

MQL_PROGRAM_NAME

Имя запущенной MQL4 программы

MQLInfoString

MQL_PROGRAM_PATH

Путь для данной запущенной программы

MQLInfoString

MQL_PROGRAM_TYPE

Тип MQL4 программы

MQLInfoInteger

MQL_SIGNALS_ALLOWED

Разрешение на работу с сигналами данной запущенной программы

MQLInfoInteger

MQL_TESTER

Признак работы запущенной программы в тестере

MQLInfoInteger

MQL_TRADE_ALLOWED

Разрешение на торговлю для данной запущенной программы

MQLInfoInteger

MQL_VISUAL_MODE

Признак работы запущенной программы в визуальном режиме тестирования

MQLInfoInteger

NULL

Ноль любого типа. Также указывает пустое состояние строки

Прочие константы

OBJ_ALL_PERIODS

Объект рисуется на всех таймфреймах

Видимость объектов

OBJ_ARROW

Объект "Стрелка"

Типы объектов

OBJ_ARROW_BUY

Знак "Buy"

Типы объектов

OBJ_ARROW_CHECK

Знак "Птичка" (галка)

Типы объектов

OBJ_ARROW_DOWN

Знак "Стрелка вниз"

Типы объектов

OBJ_ARROW_LEFT_PRICE

Левая ценовая метка

Типы объектов

OBJ_ARROW_RIGHT_PRICE

Правая ценовая метка

Типы объектов

OBJ_ARROW_SELL

Знак "Sell"

Типы объектов

OBJ_ARROW_STOP

Знак "Стоп"

Типы объектов

OBJ_ARROW_THUMB_DOWN

Знак "Плохо" (большой палец вниз)

Типы объектов

OBJ_ARROW_THUMB_UP

Знак "Хорошо" (большой палец вверх)

Типы объектов

OBJ_ARROW_UP

Знак "Стрелка вверх"

Типы объектов

OBJ_BITMAP

Объект "Рисунок"

Типы объектов

OBJ_BITMAP_LABEL

Объект "Графическая метка"

Типы объектов

OBJ_BUTTON

Объект "Кнопка"

Типы объектов

OBJ_CHANNEL

Равноудаленный канал

Типы объектов

OBJ_CYCLES

Циклические линии

Типы объектов

OBJ_EDIT

Объект "Поле ввода"

Типы объектов

OBJ_ELLIPSE

Эллипс

Типы объектов

OBJ_EVENT

Объект "Событие", соответствующий событию в экономическом календаре

Типы объектов

OBJ_EXPANSION

Расширение Фибоначчи

Типы объектов

OBJ_FIBO

Уровни Фибоначчи

Типы объектов

OBJ_FIBOARC

Дуги Фибоначчи

Типы объектов

OBJ_FIBOCHANNEL

Канал Фибоначчи

Типы объектов

OBJ_FIBOFAN

Веер Фибоначчи

Типы объектов

OBJ_FIBOTIMES

Временные зоны Фибоначчи

Типы объектов

OBJ_GANNFAN

Веер Ганна

Типы объектов

OBJ_GANNGRID

Сетка Ганна

Типы объектов

OBJ_GANNLINE

Линия Ганна

Типы объектов

OBJ_HLINE

Горизонтальная линия

Типы объектов

OBJ_LABEL

Объект "Текстовая метка"

Типы объектов

OBJ_NO_PERIODS, EMPTY

Объект не показывается ни на одном таймфрейме

Видимость объектов

OBJ_PERIOD_D1

Объект рисуется только на дневных графиках

Видимость объектов

OBJ_PERIOD_H1

Объект рисуется только на 1-часовых графиках

Видимость объектов

OBJ_PERIOD_H4

Объект рисуется только на 4-часовых графиках

Видимость объектов

OBJ_PERIOD_M1

Объект рисуется только на 1-минутных графиках

Видимость объектов

OBJ_PERIOD_M15

Объект рисуется только на 15-минутных графиках

Видимость объектов

OBJ_PERIOD_M30

Объект рисуется только на 30-минутных графиках

Видимость объектов

OBJ_PERIOD_M5

Объект рисуется только на 5-минутных графиках

Видимость объектов

OBJ_PERIOD_MN1

Объект рисуется только на месячных графиках

Видимость объектов

OBJ_PERIOD_W1

Объект рисуется только на недельных графиках

Видимость объектов

OBJ_PITCHFORK

Вилы Эндрюса

Типы объектов

OBJ_RECTANGLE

Прямоугольник

Типы объектов

OBJ_RECTANGLE_LABEL

Объект "Прямоугольная метка"для создания и оформления пользовательского графического интерфейса.

Типы объектов

OBJ_REGRESSION

Канал на линейной регрессии

Типы объектов

OBJ_STDDEVCHANNEL

Канал стандартного отклонения

Типы объектов

OBJ_TEXT

Объект "Текст"

Типы объектов

OBJ_TREND

Трендовая линия

Типы объектов

OBJ_TRENDBYANGLE

Трендовая линия по углу

Типы объектов

OBJ_TRIANGLE

Треугольник

Типы объектов

OBJ_VLINE

Вертикальная линия

Типы объектов

OBJPROP_ALIGN

Горизонтальное выравнивание текста в объекте "Поле ввода" (OBJ_EDIT)

ObjectGetInteger, ObjectSetInteger

OBJPROP_ANCHOR

Положение точки привязки графического объекта

ObjectGetInteger, ObjectSetInteger

OBJPROP_ANGLE

Получает/устанавливает значение угла в градусах объекта OBJ_TRENDBYANGLE

ObjectGet, ObjectSet

OBJPROP_ARROWCODE

Получает/устанавливает код стрелки объекта OBJ_ARROW. Может быть одним из символов wingdings или один из предопределенных кодов стрелок

ObjectGet, ObjectSet

OBJPROP_BACK

Получает/устанавливает флаг фонового отображения объекта

ObjectGet, ObjectSet

OBJPROP_BGCOLOR

Цвет фона для OBJ_EDIT, OBJ_BUTTON, OBJ_RECTANGLE_LABEL

ObjectGetInteger, ObjectSetInteger

OBJPROP_BMPFILE

Имя BMP-файла для объекта "Графическая метка". Смотри также Ресурсы

ObjectGetString, ObjectSetString

OBJPROP_BORDER_COLOR

Цвет рамки для объекта OBJ_EDIT и OBJ_BUTTON

ObjectGetInteger, ObjectSetInteger

OBJPROP_BORDER_TYPE

Тип рамки для объекта "Прямоугольная рамка"

ObjectGetInteger, ObjectSetInteger

OBJPROP_COLOR

Получает/устанавливает цвет объекта

ObjectGet, ObjectSet

OBJPROP_CORNER

Получает/устанавливает номер угла привязки для объекта OBJ_LABEL. Принимает значения 0-3

ObjectGet, ObjectSet

OBJPROP_CREATETIME

Время создания объекта

ObjectGetInteger, ObjectSetInteger

OBJPROP_DEVIATION

Получает/устанавливает размер отклонения для объекта OBJ_STDDEVCHANNEL

ObjectGet, ObjectSet

OBJPROP_DRAWLINES

Отображение линий для волновой разметки Эллиота

ObjectGetInteger, ObjectSetInteger

OBJPROP_ELLIPSE

Получает/устанавливает флаг отображения полного эллипса для объекта OBJ_FIBOARC

ObjectGet, ObjectSet

OBJPROP_FIBOLEVELS

Получает/устанавливает число уровней объекта Fibonacci. Может быть от 1 до 32

ObjectGet, ObjectSet

OBJPROP_FIRSTLEVEL+n

Получает/устанавливает значения уровня объекта Fibonacci с индексом n. Индекс n может быть от 0 до (количество уровней -1), но не более 31

ObjectGet, ObjectSet

OBJPROP_FONT

Шрифт

ObjectGetString, ObjectSetString

OBJPROP_FONTSIZE

Получает/устанавливает размер шрифта для объектов OBJ_TEXT и OBJ_LABEL

ObjectGet, ObjectSet

OBJPROP_HIDDEN

Запрет на показ имени графического объекта в списке объектов из меню терминала "Графики" - "Объекты" - "Список объектов". Значение true позволяет скрыть ненужный для пользователя объект из списка. По умолчанию true устанавливается для объектов, которые отображают события календаря, историю торговли, а также для созданных из MQL4-программы. Для того чтобы увидеть такие графические объекты и получить доступ к их свойствам, нужно нажать кнопку "Все" в окне "Список объектов".

ObjectGetInteger, ObjectSetInteger

OBJPROP_LEVELCOLOR

Получает/устанавливает цвет линии уровня объекта

ObjectGet, ObjectSet

OBJPROP_LEVELS

Количество уровней

ObjectGetInteger, ObjectSetInteger

OBJPROP_LEVELSTYLE

Получает/устанавливает стиль линии уровня объекта

ObjectGet, ObjectSet

OBJPROP_LEVELTEXT

Описание уровня

ObjectGetString, ObjectSetString

OBJPROP_LEVELVALUE

Значение уровня

ObjectGetDouble, ObjectSetDouble

OBJPROP_LEVELWIDTH

Получает/устанавливает ширину линии уровня объекта

ObjectGet, ObjectSet

OBJPROP_NAME

Имя объекта

ObjectGetString, ObjectSetString

OBJPROP_PRICE

Координата цены

ObjectGetDouble, ObjectSetDouble

OBJPROP_PRICE1

Получает/устанавливает первую координату цены

ObjectGet, ObjectSet

OBJPROP_PRICE2

Получает/устанавливает вторую координату цены

ObjectGet, ObjectSet

OBJPROP_PRICE3

Получает/устанавливает третью координату цены

ObjectGet, ObjectSet

OBJPROP_RAY

Получает/устанавливает флаг свойства луч для объектов типа OBJ_TREND и ему подобных

ObjectGet, ObjectSet

OBJPROP_RAY_RIGHT

Луч продолжается вправо

ObjectGetInteger, ObjectSetInteger

OBJPROP_READONLY

Возможность редактирования текста в объекте Edit

ObjectGetInteger, ObjectSetInteger

OBJPROP_SCALE

Получает/устанавливает значение масштаба объекта

ObjectGet, ObjectSet

OBJPROP_SELECTABLE

Доступность объекта

ObjectGetInteger, ObjectSetInteger

OBJPROP_SELECTED

Выделенность объекта

ObjectGetInteger, ObjectSetInteger

OBJPROP_STATE

Состояние кнопки (Нажата/Отжата)

ObjectGetInteger, ObjectSetInteger

OBJPROP_STYLE

Получает/устанавливает стиль линии объекта

ObjectGet, ObjectSet

OBJPROP_SYMBOL

Символ для объекта "График"

ObjectGetString, ObjectSetString

OBJPROP_TEXT

Описание объекта (текст, содержащийся в объекте)

ObjectGetString, ObjectSetString

OBJPROP_TIME

Координата времени

ObjectGetInteger, ObjectSetInteger

OBJPROP_TIME1

Получает/устанавливает первую координату времени

ObjectGet, ObjectSet

OBJPROP_TIME2

Получает/устанавливает вторую координату времени

ObjectGet, ObjectSet

OBJPROP_TIME3

Получает/устанавливает третью координату времени

ObjectGet, ObjectSet

OBJPROP_TIMEFRAMES

Получает/устанавливает свойство отображения объекта на различных периодах. Может быть одним или комбинацией нескольких из констант видимости объекта

ObjectGet, ObjectSet

OBJPROP_TOOLTIP

Текст всплывающей подсказки. Если свойство не задано, то показывается подсказка, автоматически сформированная терминалом. Можно отключить показ подсказки, установив для нее значение "\n" (перевод строки)

ObjectGetString, ObjectSetString

OBJPROP_TYPE

Тип объекта

ObjectGetInteger, ObjectSetInteger

OBJPROP_WIDTH

Получает/устанавливает ширину линии объекта

ObjectGet, ObjectSet

OBJPROP_XDISTANCE

Получает/устанавливает расстояние X-координаты в пикселях относительно угла привязки (см. примечание)

ObjectGet, ObjectSet

OBJPROP_XOFFSET

X-координата левого верхнего угла прямоугольной области видимости в графических объектах "Графическая метка" и "Рисунок" (OBJ_BITMAP_LABEL и OBJ_BITMAP). Значение задается в пикселях относительного верхнего левого угла исходного изображения.

ObjectGetInteger, ObjectSetInteger

OBJPROP_XSIZE

Ширина объекта по оси X в пикселях. Задается для объектов OBJ_LABEL (read-only), OBJ_BUTTON, OBJ_BITMAP, OBJ_BITMAP_LABEL, OBJ_EDIT, OBJ_RECTANGLE_LABEL.

ObjectGetInteger, ObjectSetInteger

OBJPROP_YDISTANCE

Получает/устанавливает расстояние Y-координаты в пикселях относительно угла привязки (см. примечание)

ObjectGet, ObjectSet

OBJPROP_YOFFSET

Y-координата левого верхнего угла прямоугольной области видимости в графических объектах "Графическая метка" и "Рисунок" (OBJ_BITMAP_LABEL и OBJ_BITMAP). Значение задается в пикселях относительного верхнего левого угла исходного изображения.

ObjectGetInteger, ObjectSetInteger

OBJPROP_YSIZE

Высота объекта по оси Y в пикселях. Задается для объектов OBJ_LABEL (read-only), OBJ_BUTTON, OBJ_BITMAP, OBJ_BITMAP_LABEL, OBJ_EDIT, OBJ_RECTANGLE_LABEL.

ObjectGetInteger, ObjectSetInteger

OBJPROP_ZORDER

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

ObjectGetInteger, ObjectSetInteger

OP_BUY

Покупка

OrderSend

OP_BUYLIMIT

Отложенный ордер BUY LIMIT

OrderSend

OP_BUYSTOP

Отложенный ордер BUY STOP

OrderSend

OP_SELL

Продажа

OrderSend

OP_SELLLIMIT

Отложенный ордер SELL LIMIT

OrderSend

OP_SELLSTOP

Отложенный ордер SELL STOP

OrderSend

PERIOD_CURRENT

Текущий период

Периоды графиков

PERIOD_D1

1 день

Периоды графиков

PERIOD_H1

1 час

Периоды графиков

PERIOD_H12

12 часов

Периоды графиков

PERIOD_H2

2 часа

Периоды графиков

PERIOD_H3

3 часа

Периоды графиков

PERIOD_H4

4 часа

Периоды графиков

PERIOD_H6

6 часа

Периоды графиков

PERIOD_H8

8 часа

Периоды графиков

PERIOD_M1

1 минута

Периоды графиков

PERIOD_M10

10 минут

Периоды графиков

PERIOD_M12

12 минут

Периоды графиков

PERIOD_M15

15 минут

Периоды графиков

PERIOD_M2

2 минуты

Периоды графиков

PERIOD_M20

20 минут

Периоды графиков

PERIOD_M3

3 минуты

Периоды графиков

PERIOD_M30

30 минут

Периоды графиков

PERIOD_M4

4 минуты

Периоды графиков

PERIOD_M5

5 минут

Периоды графиков

PERIOD_M6

6 минут

Периоды графиков

PERIOD_MN1

1 месяц

Периоды графиков

PERIOD_W1

1 неделя

Периоды графиков

POINTER_AUTOMATIC

Указатель любого объекта, созданного автоматически (без использования new())

CheckPointer

POINTER_DYNAMIC

Указатель объекта, созданного оператором new

CheckPointer

POINTER_INVALID

Некорректный указатель

CheckPointer

PRICE_CLOSE

Цена закрытия

Ценовые константы

PRICE_HIGH

Максимальная за период цена

Ценовые константы

PRICE_LOW

Минимальная за период цена

Ценовые константы

PRICE_MEDIAN

Медианная цена, (high+low)/2

Ценовые константы

PRICE_OPEN

Цена открытия

Ценовые константы

PRICE_TYPICAL

Типичная цена, (high+low+close)/3

Ценовые константы

PRICE_WEIGHTED

Средневзвешенная цена, (high+low+close+close)/4

Ценовые константы

REASON_ACCOUNT

Активирован другой счет либо произошло переподключение к торговому серверу вследствие изменения настроек счета

UninitializeReason

REASON_CHARTCHANGE

Символ или период графика был изменен

UninitializeReason

REASON_CHARTCLOSE

График закрыт

UninitializeReason

REASON_CLOSE

Терминал был закрыт

UninitializeReason

REASON_INITFAILED

Признак того, что обработчик OnInit() вернул ненулевое значение

UninitializeReason

REASON_PARAMETERS

Входные параметры были изменены пользователем

UninitializeReason

REASON_PROGRAM

Эксперт прекратил свою работу, вызвав функцию ExpertRemove()

UninitializeReason

REASON_RECOMPILE

Программа перекомпилирована

UninitializeReason

REASON_REMOVE

Программа удалена с графика

UninitializeReason

REASON_TEMPLATE

Применен другой шаблон графика

UninitializeReason

SATURDAY

Суббота

SymbolInfoSessionQuote, SymbolInfoSessionTrade

SEEK_CUR

Текущая позиция файлового указателя

FileSeek

SEEK_END

Конец файла

FileSeek

SEEK_SET

Начало файла

FileSeek

SELECT_BY_POS

Ордер выбирается по его порядковому номеру в списке ордеров

OrderSelect

SELECT_BY_TICKET

Ордер выбирается по его тикету

OrderSelect

SERIES_BARS_COUNT

Количество баров по символу-периоду на данный момент

SeriesInfoInteger

SERIES_FIRSTDATE

Самая первая дата по символу-периоду на данный момент

SeriesInfoInteger

SERIES_LASTBAR_DATE

Время открытия последнего бара по символу-периоду

SeriesInfoInteger

SERIES_SERVER_FIRSTDATE

Самая первая дата в истории по символу на сервере независимо от периода

SeriesInfoInteger

SHORT_MAX

Максимальное значение, которое может быть представлено типом short

Константы числовых типов

SHORT_MIN

Минимальное значение, которое может быть представлено типом short

Константы числовых типов

SIGNAL_BASE_AUTHOR_LOGIN

Логин автора сигнала

SignalBaseGetString

SIGNAL_BASE_BALANCE

Баланс счета

SignalBaseGetDouble

SIGNAL_BASE_BROKER

Наименование брокера (компании)

SignalBaseGetString

SIGNAL_BASE_BROKER_SERVER

Сервер брокера

SignalBaseGetString

SIGNAL_BASE_CURRENCY

Валюта счета сигнала

SignalBaseGetString

SIGNAL_BASE_DATE_PUBLISHED

Дата публикации сигнала (когда стал доступен для подписки)

SignalBaseGetInteger

SIGNAL_BASE_DATE_STARTED

Дата начала мониторинга сигнала

SignalBaseGetInteger

SIGNAL_BASE_EQUITY

Средства на счете

SignalBaseGetDouble

SIGNAL_BASE_GAIN

Прирост счета в процентах

SignalBaseGetDouble

SIGNAL_BASE_ID

ID сигнала

SignalBaseGetInteger

SIGNAL_BASE_LEVERAGE

Плечо торгового счета

SignalBaseGetInteger

SIGNAL_BASE_MAX_DRAWDOWN

Максимальная просадка

SignalBaseGetDouble

SIGNAL_BASE_NAME

Имя сигнала

SignalBaseGetString

SIGNAL_BASE_PIPS

Результат торговли в пипсах

SignalBaseGetInteger

SIGNAL_BASE_PRICE

Цена подписки на сигнал

SignalBaseGetDouble

SIGNAL_BASE_RATING

Позиция в рейтинге сигналов

SignalBaseGetInteger

SIGNAL_BASE_ROI

Значение ROI (Return on Investment) сигнала в %

SignalBaseGetDouble

SIGNAL_BASE_SUBSCRIBERS

Количество подписчиков

SignalBaseGetInteger

SIGNAL_BASE_TRADE_MODE

Тип счета (0-реальный счет, 1-демо-счет, 2-конкурсный счет)

SignalBaseGetInteger

SIGNAL_BASE_TRADES

Количество трейдов

SignalBaseGetInteger

SIGNAL_INFO_CONFIRMATIONS_DISABLED

Флаг разрешения синхронизации без показа диалога подтверждения

SignalInfoGetInteger, SignalInfoSetInteger

SIGNAL_INFO_COPY_SLTP

Флаг копирования Stop Loss и Take Profit

SignalInfoGetInteger, SignalInfoSetInteger

SIGNAL_INFO_DEPOSIT_PERCENT

Ограничения по депозиту (в %)

SignalInfoGetInteger, SignalInfoSetInteger

SIGNAL_INFO_EQUITY_LIMIT

Процент для конвертации объема сделки

SignalInfoGetDouble, SignalInfoSetDouble

SIGNAL_INFO_ID

id сигнала, r/o

SignalInfoGetInteger, SignalInfoSetInteger

SIGNAL_INFO_NAME

Имя сигнала, r/o

SignalInfoGetString

SIGNAL_INFO_SLIPPAGE

Величина проскальзывания, с которым выставляются рыночные ордера при синхронизации позиций и копировании сделок

SignalInfoGetDouble, SignalInfoSetDouble

SIGNAL_INFO_SUBSCRIPTION_ENABLED

Флаг разрешения на копирование сделок по подписке

SignalInfoGetInteger, SignalInfoSetInteger

SIGNAL_INFO_TERMS_AGREE

Флаг согласия с условиями использования сервиса "Сигналы", r/o

SignalInfoGetInteger, SignalInfoSetInteger

SIGNAL_INFO_VOLUME_PERCENT

Значение ограничения по средствам для сигнала, r/o

SignalInfoGetDouble, SignalInfoSetDouble

STAT_BALANCE_DD

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

TesterStatistics

STAT_BALANCE_DD_RELATIVE

Просадка баланса в деньгах, которая была зафиксирована в момент максимальной просадки баланса в процентах (STAT_BALANCE_DDREL_PERCENT).

TesterStatistics

STAT_BALANCE_DDREL_PERCENT

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

TesterStatistics

STAT_BALANCEDD_PERCENT

Просадка баланса в процентах, которая была зафиксирована в момент максимальной просадки баланса в деньгах (STAT_BALANCE_DD).

TesterStatistics

STAT_BALANCEMIN

Минимальное значение баланса

TesterStatistics

STAT_CONLOSSMAX

Максимальный убыток в последовательности убыточных трейдов. Значение меньше или равно нулю

TesterStatistics

STAT_CONLOSSMAX_TRADES

Количество трейдов, сформировавших STAT_CONLOSSMAX (максимальный убыток в последовательности убыточных трейдов)

TesterStatistics

STAT_CONPROFITMAX

Максимальная прибыль в последовательности прибыльных трейдов. Значение больше или равно нулю

TesterStatistics

STAT_CONPROFITMAX_TRADES

Количество трейдов, сформировавших STAT_CONPROFITMAX (максимальная прибыль в последовательности прибыльных трейдов)

TesterStatistics

STAT_CUSTOM_ONTESTER

Значение рассчитанного пользовательского критерия оптимизации, возвращаемого функцией OnTester()

TesterStatistics

STAT_DEALS

Количество совершенных сделок

TesterStatistics

STAT_EQUITY_DD

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

TesterStatistics

STAT_EQUITY_DD_RELATIVE

Просадка средств в деньгах, которая была зафиксирована в момент максимальной просадки средств в процентах (STAT_EQUITY_DDREL_PERCENT).

TesterStatistics

STAT_EQUITY_DDREL_PERCENT

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

TesterStatistics

STAT_EQUITYDD_PERCENT

Просадка средств в процентах, которая была зафиксирована в момент максимальной просадки средств в деньгах (STAT_EQUITY_DD).

TesterStatistics

STAT_EQUITYMIN

Минимальное значение собственных средств

TesterStatistics

STAT_EXPECTED_PAYOFF

Математическое ожидание выигрыша

TesterStatistics

STAT_GROSS_LOSS

Общий убыток, сумма всех убыточных (отрицательных) трейдов. Значение меньше или равно нулю

TesterStatistics

STAT_GROSS_PROFIT

Общая прибыль, сумма всех прибыльных (положительных) трейдов. Значение больше или равно нулю

TesterStatistics

STAT_INITIAL_DEPOSIT

Значение начального депозита

TesterStatistics

STAT_LONG_TRADES

Длинные трейды

TesterStatistics

STAT_LOSS_TRADES

Убыточные трейды

TesterStatistics

STAT_LOSSTRADES_AVGCON

Средняя длина убыточной серии трейдов

TesterStatistics

STAT_MAX_CONLOSS_TRADES

Количество трейдов в самой длинной серии убыточных трейдов STAT_MAX_CONLOSSES

TesterStatistics

STAT_MAX_CONLOSSES

Общий убыток в самой длинной серии убыточных трейдов

TesterStatistics

STAT_MAX_CONPROFIT_TRADES

Количество трейдов в самой длинной серии прибыльных трейдов STAT_MAX_CONWINS

TesterStatistics

STAT_MAX_CONWINS

Общая прибыль в самой длинной серии прибыльных трейдов

TesterStatistics

STAT_MAX_LOSSTRADE

Максимальный убыток – наименьшее значение среди всех убыточных трейдов. Значение меньше или равно нулю

TesterStatistics

STAT_MAX_PROFITTRADE

Максимальная прибыль – наибольшее значение среди всех прибыльных трейдов. Значение больше или равно нулю

TesterStatistics

STAT_MIN_MARGINLEVEL

Миниимальное достигнутое значение уровня маржи

TesterStatistics

STAT_PROFIT

Чистая прибыль по окончании тестирования, сумма STAT_GROSS_PROFIT и STAT_GROSS_LOSS (STAT_GROSS_LOSS всегда меньше или равно нулю)

TesterStatistics

STAT_PROFIT_FACTOR

Прибыльность – отношение STAT_GROSS_PROFIT/STAT_GROSS_LOSS. Если STAT_GROSS_LOSS=0, то прибыльность принимает значение DBL_MAX

TesterStatistics

STAT_PROFIT_LONGTRADES

Длинные прибыльные трейды

TesterStatistics

STAT_PROFIT_SHORTTRADES

Короткие прибыльные трейды

TesterStatistics

STAT_PROFIT_TRADES

Прибыльные трейды

TesterStatistics

STAT_PROFITTRADES_AVGCON

Средняя длина прибыльной серии трейдов

TesterStatistics

STAT_RECOVERY_FACTOR

Фактор восстановления – отношение STAT_PROFIT/STAT_BALANCE_DD

TesterStatistics

STAT_SHARPE_RATIO

Коэффициент Шарпа

TesterStatistics

STAT_SHORT_TRADES

Короткие трейды

TesterStatistics

STAT_TRADES

Количество трейдов

TesterStatistics

STAT_WITHDRAWAL

Количество выведенных со счета средств

TesterStatistics

STO_CLOSECLOSE

Построение по ценам Close/Close

iStochastic

STO_LOWHIGH

Построение по ценам Low/High

iStochastic

STYLE_DASH

Штриховая линия

Стили рисования

STYLE_DASHDOT

Штрих-пунктирная линия

Стили рисования

STYLE_DASHDOTDOT

Штрих-пунктирная линия с двойными точками

Стили рисования

STYLE_DOT

Пунктирная линия

Стили рисования

STYLE_SOLID

Сплошная линия

Стили рисования

SUNDAY

Воскресенье

SymbolInfoSessionQuote, SymbolInfoSessionTrade

SYMBOL_ARROWDOWN

Символ - стрелка вниз

Коды стрелок

SYMBOL_ARROWUP

Символ - стрелка вверх

Коды стрелок

SYMBOL_ASK

Ask - лучшее предложение на покупку

SymbolInfoDouble

SYMBOL_ASKHIGH

Не поддерживается

SymbolInfoDouble

SYMBOL_ASKLOW

Не поддерживается

SymbolInfoDouble

SYMBOL_BID

Bid - лучшее предложение на продажу

SymbolInfoDouble

SYMBOL_BIDHIGH

Не поддерживается

SymbolInfoDouble

SYMBOL_BIDLOW

Не поддерживается

SymbolInfoDouble

SYMBOL_CHECKSIGN

Символ - галочка

Коды стрелок

SYMBOL_CURRENCY_BASE

Базовая валюта инструмента

SymbolInfoString

SYMBOL_CURRENCY_MARGIN

Валюта в которой вычисляется залоговые средства

SymbolInfoString

SYMBOL_CURRENCY_PROFIT

Валюта прибыли

SymbolInfoString

SYMBOL_DESCRIPTION

Строковое описание символа

SymbolInfoString

SYMBOL_DIGITS

Количество знаков после запятой

SymbolInfoInteger

SYMBOL_EXPIRATION_MODE

Не поддерживается

SymbolInfoInteger

SYMBOL_EXPIRATION_TIME

Дата окончания торгов по инструменту (обычно используется для фьючерсов)

SymbolInfoInteger

SYMBOL_FILLING_MODE

Не поддерживается

SymbolInfoInteger

SYMBOL_LAST

Не поддерживается

SymbolInfoDouble

SYMBOL_LASTHIGH

Не поддерживается

SymbolInfoDouble

SYMBOL_LASTLOW

Не поддерживается

SymbolInfoDouble

SYMBOL_LEFTPRICE

Левая ценовая метка

Коды стрелок

SYMBOL_MARGIN_INITIAL

Начальная (инициирующая) маржа обозначает размер необходимых залоговых средств в маржинальной валюте для открытия ордера объемом в один лот. Используется при проверке средств клиента при входе в рынок.

SymbolInfoDouble

SYMBOL_MARGIN_LIMIT

Не поддерживается

SymbolInfoDouble

SYMBOL_MARGIN_LONG

Не поддерживается

SymbolInfoDouble

SYMBOL_MARGIN_MAINTENANCE

Поддерживающая маржа по инструменту. В случае если задана – указывает размер маржи в маржинальной валюте инструмента, удерживаемой с одного лота. Используется при проверке средств клиента при изменении состояния счета клиента. Если поддерживающая маржа равна 0, то используется начальная маржа.

SymbolInfoDouble

SYMBOL_MARGIN_SHORT

Не поддерживается

SymbolInfoDouble

SYMBOL_MARGIN_STOP

Не поддерживается

SymbolInfoDouble

SYMBOL_MARGIN_STOPLIMIT

Не поддерживается

SymbolInfoDouble

SYMBOL_ORDER_MODE

Не поддерживается

SymbolInfoInteger

SYMBOL_PATH

Путь в дереве символов

SymbolInfoString

SYMBOL_POINT

Значение одного пункта

SymbolInfoDouble

SYMBOL_RIGHTPRICE

Правая ценовая метка

Коды стрелок

SYMBOL_SELECT

Признак того, что символ выбран в Market Watch

SymbolInfoInteger

SYMBOL_SESSION_AW

Не поддерживается

SymbolInfoDouble

SYMBOL_SESSION_BUY_ORDERS

Не поддерживается

SymbolInfoInteger

SYMBOL_SESSION_BUY_ORDERS_VOLUME

Не поддерживается

SymbolInfoDouble

SYMBOL_SESSION_CLOSE

Не поддерживается

SymbolInfoDouble

SYMBOL_SESSION_DEALS

Не поддерживается

SymbolInfoInteger

SYMBOL_SESSION_INTEREST

Не поддерживается

SymbolInfoDouble

SYMBOL_SESSION_OPEN

Не поддерживается

SymbolInfoDouble

SYMBOL_SESSION_PRICE_LIMIT_MAX

Не поддерживается

SymbolInfoDouble

SYMBOL_SESSION_PRICE_LIMIT_MIN

Не поддерживается

SymbolInfoDouble

SYMBOL_SESSION_PRICE_SETTLEMENT

Не поддерживается

SymbolInfoDouble

SYMBOL_SESSION_SELL_ORDERS

Не поддерживается

SymbolInfoInteger

SYMBOL_SESSION_SELL_ORDERS_VOLUME

Не поддерживается

SymbolInfoDouble

SYMBOL_SESSION_TURNOVER

Не поддерживается

SymbolInfoDouble

SYMBOL_SESSION_VOLUME

Не поддерживается

SymbolInfoDouble

SYMBOL_SPREAD

Размер спреда в пунктах

SymbolInfoInteger

SYMBOL_SPREAD_FLOAT

Признак плавающего спреда

SymbolInfoInteger

SYMBOL_START_TIME

Дата начала торгов по инструменту (обычно используется для фьючерсов)

SymbolInfoInteger

SYMBOL_STOPSIGN

Символ - СТОП

Коды стрелок

SYMBOL_SWAP_LONG

Значение свопа в покупку

SymbolInfoDouble

SYMBOL_SWAP_MODE

Модель расчета свопа

SymbolInfoInteger

SYMBOL_SWAP_ROLLOVER3DAYS

День недели для начисления тройного свопа

SymbolInfoInteger

SYMBOL_SWAP_SHORT

Значение свопа в продажу

SymbolInfoDouble

SYMBOL_THUMBSDOWN

Символ - большой палец вниз

Коды стрелок

SYMBOL_THUMBSUP

Символ - большой палец вверх

Коды стрелок

SYMBOL_TIME

Время последней котировки

SymbolInfoInteger

SYMBOL_TRADE_CALC_MODE

Способ вычисления стоимости контракта

SymbolInfoInteger

SYMBOL_TRADE_CONTRACT_SIZE

Размер торгового контракта

SymbolInfoDouble

SYMBOL_TRADE_EXECUTION_EXCHANGE

Биржевое исполнение

SymbolInfoInteger

SYMBOL_TRADE_EXECUTION_INSTANT

Торговля по потоковым ценам

SymbolInfoInteger

SYMBOL_TRADE_EXECUTION_MARKET

Исполнение ордеров по рынку

SymbolInfoInteger

SYMBOL_TRADE_EXECUTION_REQUEST

Торговля по запросу

SymbolInfoInteger

SYMBOL_TRADE_EXEMODE

Режим заключения сделок

SymbolInfoInteger

SYMBOL_TRADE_FREEZE_LEVEL

Дистанция заморозки торговых операций (в пунктах)

SymbolInfoInteger

SYMBOL_TRADE_MODE

Тип исполнения ордеров

SymbolInfoInteger

SYMBOL_TRADE_MODE_CLOSEONLY

Разрешены только операции закрытия позиций

SymbolInfoInteger

SYMBOL_TRADE_MODE_DISABLED

Торговля по символу запрещена

SymbolInfoInteger

SYMBOL_TRADE_MODE_FULL

Нет ограничений на торговые операции

SymbolInfoInteger

SYMBOL_TRADE_MODE_LONGONLY

Разрешены только покупки

SymbolInfoInteger

SYMBOL_TRADE_MODE_SHORTONLY

Разрешены только продажи

SymbolInfoInteger

SYMBOL_TRADE_STOPS_LEVEL

Минимальный отступ в пунктах от текущей цены закрытия для установки Stop ордеров

SymbolInfoInteger

SYMBOL_TRADE_TICK_SIZE

Минимальное изменение цены

SymbolInfoDouble

SYMBOL_TRADE_TICK_VALUE

Значение SYMBOL_TRADE_TICK_VALUE_PROFIT

SymbolInfoDouble

SYMBOL_TRADE_TICK_VALUE_LOSS

Не поддерживается

SymbolInfoDouble

SYMBOL_TRADE_TICK_VALUE_PROFIT

Не поддерживается

SymbolInfoDouble

SYMBOL_VOLUME

Не поддерживается

SymbolInfoInteger

SYMBOL_VOLUME_LIMIT

Не поддерживается

SymbolInfoDouble

SYMBOL_VOLUME_MAX

Максимальный объем для заключения сделки

SymbolInfoDouble

SYMBOL_VOLUME_MIN

Минимальный объем для заключения сделки

SymbolInfoDouble

SYMBOL_VOLUME_STEP

Минимальный шаг изменения объема для заключения сделки

SymbolInfoDouble

SYMBOL_VOLUMEHIGH

Не поддерживается

SymbolInfoInteger

SYMBOL_VOLUMELOW

Не поддерживается

SymbolInfoInteger

TERMINAL_BUILD

Номер билда запущенного терминала

TerminalInfoInteger

TERMINAL_CODEPAGE

Номер кодовой страницы языка, установленного в клиентском терминале

TerminalInfoInteger

TERMINAL_COMMONDATA_PATH

Общая папка всех клиентских терминалов, установленных на компьютере

TerminalInfoString

TERMINAL_COMMUNITY_ACCOUNT

Флаг наличия авторизационных данных MQL5.community в терминале

TerminalInfoInteger

TERMINAL_COMMUNITY_BALANCE

Баланс пользователя в MQL5.community

TerminalInfoDouble

TERMINAL_COMMUNITY_CONNECTION

Наличие подключения к MQL5.community

TerminalInfoInteger

TERMINAL_COMPANY

Имя компании

TerminalInfoString

TERMINAL_CONNECTED

Наличие подключения к торговому серверу

TerminalInfoInteger

TERMINAL_CPU_CORES

Количество процессоров в системе

TerminalInfoInteger

TERMINAL_DATA_PATH

Папка, в которой хранятся данные терминала

TerminalInfoString

TERMINAL_DISK_SPACE

Объем свободной памяти на диске для папки MQL4\Files терминала (агента), в Mb

TerminalInfoInteger

TERMINAL_DLLS_ALLOWED

Разрешение на использование DLL

TerminalInfoInteger

TERMINAL_EMAIL_ENABLED

Разрешение на отправку писем с использованием SMTP-сервера и логина,указанных в настройках терминала

TerminalInfoInteger

TERMINAL_FTP_ENABLED

Разрешение на отправку отчетов по FTP на указанный сервер для указанного в настройках терминала торгового счета

TerminalInfoInteger

TERMINAL_LANGUAGE

Язык терминала

TerminalInfoString

TERMINAL_MAXBARS

Максимальное количество баров на графике

TerminalInfoInteger

TERMINAL_MEMORY_AVAILABLE

Размер свободной памяти процесса терминала (агента)в Mb

TerminalInfoInteger

TERMINAL_MEMORY_PHYSICAL

Размер физической памяти в системе, в Mb

TerminalInfoInteger

TERMINAL_MEMORY_TOTAL

Размер памяти, доступной процессу терминала (агента), в Mb

TerminalInfoInteger

TERMINAL_MEMORY_USED

Размер памяти, использованной терминалом (агентом), в Mb

TerminalInfoInteger

TERMINAL_MQID

Флаг наличия MetaQuotes ID для отправки Push-уведомлений

TerminalInfoInteger

TERMINAL_NAME

Имя терминала

TerminalInfoString

TERMINAL_NOTIFICATIONS_ENABLED

Разрешение на отправку уведомлений на смартфон

TerminalInfoInteger

TERMINAL_PATH

Папка, из которой запущен терминал

TerminalInfoString

TERMINAL_PING_LAST

Последнее известное значение пинга до торгового сервера в микросекундах. В одной секунде миллион микросекунд

TerminalInfoInteger

TERMINAL_SCREEN_DPI

Разрешающая способность вывода информации на экран

TerminalInfoInteger

TERMINAL_TRADE_ALLOWED

Разрешение на торговлю

TerminalInfoInteger

THURSDAY

Четверг

SymbolInfoSessionQuote, SymbolInfoSessionTrade

TUESDAY

Вторник

SymbolInfoSessionQuote, SymbolInfoSessionTrade

UCHAR_MAX

Максимальное значение, которое может быть представлено типом uchar

Константы числовых типов

UINT_MAX

Максимальное значение, которое может быть представлено типом uint

Константы числовых типов

ULONG_MAX

Максимальное значение, которое может быть представлено типом ulong

Константы числовых типов

USHORT_MAX

Максимальное значение, которое может быть представлено типом ushort

Константы числовых типов

VOLUME_TICK

Тиковый объем

Ценовые константы

WEDNESDAY

Среда

SymbolInfoSessionQuote, SymbolInfoSessionTrade

WHOLE_ARRAY

Означает количество элементов, оставшееся до конца массива, то есть, будет обработан весь массив

Прочие константы

WRONG_VALUE

Константа может неявно приводиться к типу любого перечисления

Прочие константы