- Новый контент
- Книга Masterforex-V
-
Академия
- Как стать слушателем Академии
- ⇒ ТС Masterforex-V - Интенсивный Курс Онлайн
- ⇒ Факультет Форекс Скальпинга Magister
- ⇒ Факультет СРЕДНЕсрочной торговли и паттернов ГОСТ
- ⇒ Кафедра ДФВА
- ⇒ Кафедра Опционной Торговли
- ⇒ Факультет биржевой торговли "Futures Trade and Stock Exchange"
- ⇒ Факультет торговли объёмом"
- ⇒ Факультет Инвестиций
- ⇒ ФАКУЛЬТЕТ Пробой Флета, Автоматизация, Автотрейдинг
- ⇒ Кафедра Спектрального Анализа FOREX и ИНДЕКСОВ валют
- ⇒ Система раннего прогнозирования в ТС МФ на основе модернизации АО и WPR
- ⇒ Кафедра FMA_Sar
- ⇒ Кафедра синергетического объемно-волнового анализа (СОВА)
- ⇒Кафедра бинарных опционов
- Как продлить доступ в закрытую часть Академии?
- Форумы
- Галерея
- Блоги
- Скачать
- Контакты
- Личный кабинет
- Больше
Инвестиционные фонды NordFx: профессиональное управление и прозрачность
|
Основы языка MQL
Автор темы:
Liv
, май 24 2007 08:31
9 ответов в этой теме
#1
Опубликовано 24 Май 2007 - 08:31
Будучи программистом и придя на Forex, я сразу же взялся за скрипты индикаторов и очень быстро всё освоил. Язык оказался очень простой и, думаю, все трейдеры его быстро освоят.
Для чего надо знать язык скриптов? Ведь самих скриптов уже огромная куча..... :)
Прежде всего для вас самих. Все скрипты были написаны кем-то для себя и не всегда вывод может вас удовлетворить. Во-вторых, может и не быть того скрипта, который вам подойдёт и вам захочется его сделать... В общем, знание языка никогда не мешало!
Мы начинаем курс ликбеза по языку MQL для трейдеров. В основном, этот курс предназначен для тех, кто ещё не знает язык, но и знающим тоже не вредно будет для освежения знаний.
Для чего надо знать язык скриптов? Ведь самих скриптов уже огромная куча..... :)
Прежде всего для вас самих. Все скрипты были написаны кем-то для себя и не всегда вывод может вас удовлетворить. Во-вторых, может и не быть того скрипта, который вам подойдёт и вам захочется его сделать... В общем, знание языка никогда не мешало!
Мы начинаем курс ликбеза по языку MQL для трейдеров. В основном, этот курс предназначен для тех, кто ещё не знает язык, но и знающим тоже не вредно будет для освежения знаний.
Удачи!
#2
Опубликовано 24 Май 2007 - 09:53
MetaQuotes Language
Введение
Язык программирования MQL используется при написании собственных программ-экспертов для автоматизации контроля торговых процессов, при написании собственных индикаторов, а также для реализации собственных торговых стратегий. MQL прост в изучении, использовании и отладке. В состав MQL включено большое количество переменных, необходимых для контроля текущих и прошлых котировок, основные арифметические и логические операции, встроены основные индикаторы и команды по открытию позиций и контролю над ними.
1. Структура программы
Все модули должны иметь определённую структуру:
Введение
Язык программирования MQL используется при написании собственных программ-экспертов для автоматизации контроля торговых процессов, при написании собственных индикаторов, а также для реализации собственных торговых стратегий. MQL прост в изучении, использовании и отладке. В состав MQL включено большое количество переменных, необходимых для контроля текущих и прошлых котировок, основные арифметические и логические операции, встроены основные индикаторы и команды по открытию позиций и контролю над ними.
1. Структура программы
Все модули должны иметь определённую структуру:
- команды препроцессора
Здесь указываются все команды препроцессора, описание индикаторов и объявление именованых констант - объявления переменных
Здесь объявляются и (если надо) инициализируются переменные - объявления функций
Здесь объявляются и описываются все функции, которые будут использованы в модуле - функция init()
Эта функция всегда автоматически вызывается при начальной инициализации модуля. При необходимости её можно вызвать из любого места модуля. - функция deinit()
Эта функция вызывается при деинициализации (удаление модуля из памяти). Применяется для удаление объектов, которые были созданы этим модулем и которые уже не нужны. - функция start()
Это главная функция. Она имеет некоторые особенности:
1. при её отсутствии модуль (скрипт, индикатор или советник) не работает.
2. она вызывается всегда после функции init().
3. для индикаторов - вызывается всегда, когда окно, к которому прикреплён этот индикатор становится активным.
4. для индикаторов и советников - вызывается после прихода очередного тика. В случае, если функция не отработала полностью, следующий тик может быть не отработан.
Удачи!
#3
Опубликовано 24 Май 2007 - 02:01
2. Команды препроцессора
- #define - объявление именованых констант.
Эта конструкция может использоваться в любом месте модуля. Важно чтобы объявление было до использования константы, в противном случае будет ошибка компилляции.
К именам констант применяются такие же требования как и к именам переменных (будет далее). Чаще всего имена констант делают ЗАГЛАВНЫМИ буквами. Таким образом они всегда выделяются в теле модуля Но это не обязательно.
Пример:
MQL[color=blue;]#define[/color] МояКонстанта 2
Здесь определяется целое число 2 как МояКонстанта. При компилляции модуля везде константа МояКонстанта будет заменена на число 2. - #property - специальные параметры скрипта/индикатора/советника
Их много и им будет посвящён отдельный пост. - #include - команда включения файла в текст модуля.
Команда может встречаться в любом месте программы, но обычно все включения размешаются в начале файла исходного текста. Очень удобно для модульного написания индикаторов/советников. После компилляции модуля присутствие включённого файла не нужно (он был включён в скомпиллированный модуль).
MQL#include <MyHeaders.mqh>
#include [color=green]"MyHeaders.mqh"[/color]
Если имя файла заключено в угловые скобки (<>), то этот файл должен находиться в стандартном каталоге experts\include. Если имя файла заключено в кавычки, то файл должен находиться в текущем каталоге. - #import - импорт исполняемых файлов.
Эта команда позволяет полностью использовать вычислительные возможности компьютера. С помощью этой команды включаются скомпиллированные модули EX4 и системные библиотеки DLL. Более подробно и с примерами мы разберём в дальнейшем.
Сообщение изменено: Liv, 27 Май 2007 - 03:05 .
Удачи!
#4
Опубликовано 24 Май 2007 - 04:26
#property - специальные параметры скрипта/индикатора/советника
Специальные параметры используются для:
link
Специальные параметры используются для:
- выделения памяти и определения линий
- настройки отображения индикаторов
- определения общего вида вывода
link
Cсылка на сайт производителя. Значение - строчная константа.
copyrightНазвание компании-производителя. Значение - строчная константа.
stacksizeРазмер стека для рекурсивных вызовов. Если рекурсии в ваших модулях нет, то этот параметр можно не указывать. Значение - целое число, указывающее количество рекурсивных вызовов ваших функций.
libraryЭтот параметр указывает на то, что данный модуль является библиотекой. Стартовая функция игнорируется, линковщик не удаляет функции, которые не вызываются из других функций. После компилляции этот модуль можно использовать как файл, импортируемый параметром #import.
indicator_chart_windowУказывает, что нужно выводить индикатор в окно графика.
indicator_separate_windowУказывает, что нужно выводить индикатор в отдельное окно.
indicator_buffersОпределяет количество буферов (массивов) для расчета индикатора. Целое число от 1 до 9.
indicator_minimumПри определении отдельного окна, указывает на нижнее, минимальное ограничение шкалы окна индикатора. Тип числа double. Значение может быть как отрицательным, так и положительным.
indicator_maximumПри определении отдельного окна, указывает на верхнее, максимальное ограничение шкалы окна индикатора.
indicator_colorNОпределяет цвет для вывода линии индикатора. N - целое число от 1 до 9 указывает на конкретную линию индикатора. Значение типа color (см. описание ниже).
indicator_widthNОпределяет толщину линии индикатора N, где N от 1 до 8. Значение - целое число указывающее на количество пикселей в линии
indicator_styleNОпределяет стиль линии индикатора N, где N от 1 до 8. Значение - целое число, уазывающее тип линии. В MQL определены константы, которыми просто пользоваться:
- STYLE_SOLID - сплошная линия
- STYLE_DASH - штриховая линия
- STYLE_DOT - пунктирная линия
- STYLE_DASHDOT - штрих-пунктирная линия
- STYLE_DASHDOTDOT - штрих-пунктирная линия с двойными точками
Определяет наличие горизонтальный линии-уровня N в отдельном окне индикатора, где N от 1 до 8. Удобно для визуального анализа сделать несколько горизонтальных линий. Значение типа double, может быть как положительным, так и отрицательным.
indicator_levelcolorОпределяет цвет горизонтальных линий-уровней индикатора в отдельном окне. Тип - color.
indicator_levelwidthОпределяет толщину горизонтальных линий-уровней индикатора. Значение - целое число в пикселях.
indicator_levelstyleОпределяет стиль горизонтальных линий-уровней индикатора. Тип - целое число. Можно использовать константы типа линий как у indicator_style.
show_confirmУстанавливает нужно ли выводить окно подтверждения перед запуском скрипта. Используется только в пользовательских скриптах; в индикаторах и советниках игнорируется.
show_inputsУстанавливает нужно ли выводить окно со свойствами перед запуском скрипта и запретить вывод окна подтверждения, т.е. если указан этот параметр, то параметр show_confirm игнорируется.
Примеры:MQL
[color=blue;]#property[/color] [color=blue;]link[/color] [color=green]"http://[color=blue;font-weight:bold]for[/color]ex.orotukan.ru/"[/color]
[color=blue;]#property[/color] [color=blue;]copyright[/color] [color=green]"Мои собственные права :)."[/color]
[color=blue;]#property[/color] [color=blue;]library[/color] // это будет библиотека
[color=blue;]#property[/color] [color=blue;]stacksize[/color] 1024 // ну очень глубокая рекурсия! :)
[color=blue;]#property[/color] [color=blue;]indicator_chart_window[/color] // эти два параметра противоречат друг другу
[color=blue;]#property[/color] [color=blue;]indicator_separate_window[/color] // и будет работать тот, который объявлен последним
[color=blue;]#property[/color] [color=blue;]indicator_buffers[/color] 1 // будет 1 линия
[color=blue;]#property[/color] [color=blue;]indicator_minimum[/color] 0 // линия будет бегать от 0
[color=blue;]#property[/color] [color=blue;]indicator_maximum[/color] 100 // до 100
[color=blue;]#property[/color] [color=blue;]indicator_color[/color]1 RED // линия будет красной
[color=blue;]#property[/color] [color=blue;]indicator_width[/color]1 1 // толщина будет 1 пиксель потому, что будет пунктир
[color=blue;]#property[/color] [color=blue;]indicator_style[/color]1 [color=navy;]STYLE_DOT[/color] // укажем её пунктирной
[color=blue;]#property[/color] [color=blue;]indicator_level[/color]1 50 // а по средине окна будет проведена тонкая линия
[color=blue;]#property[/color] [color=blue;][color=blue;]indicator_level[/color]color[/color] SILVER // она будет серебристая (светло-серая)
[color=blue;]#property[/color] [color=blue;][color=blue;]indicator_level[/color]width[/color] 1 // толщина 1 пиксель
[color=blue;]#property[/color] [color=blue;][color=blue;]indicator_level[/color]style[/color] [color=navy;]STYLE_DOT[/color] // пунктирная
[color=blue;]#property[/color] [color=blue;]show_confirm[/color] // это для скриптов - подтверждение запуска скрипта.
[color=blue;]#property[/color] [color=blue;]show_inputs[/color] // или запрос ввода параметров
[color=blue;]#property[/color] [color=blue;]copyright[/color] [color=green]"Мои собственные права :)."[/color]
[color=blue;]#property[/color] [color=blue;]library[/color] // это будет библиотека
[color=blue;]#property[/color] [color=blue;]stacksize[/color] 1024 // ну очень глубокая рекурсия! :)
[color=blue;]#property[/color] [color=blue;]indicator_chart_window[/color] // эти два параметра противоречат друг другу
[color=blue;]#property[/color] [color=blue;]indicator_separate_window[/color] // и будет работать тот, который объявлен последним
[color=blue;]#property[/color] [color=blue;]indicator_buffers[/color] 1 // будет 1 линия
[color=blue;]#property[/color] [color=blue;]indicator_minimum[/color] 0 // линия будет бегать от 0
[color=blue;]#property[/color] [color=blue;]indicator_maximum[/color] 100 // до 100
[color=blue;]#property[/color] [color=blue;]indicator_color[/color]1 RED // линия будет красной
[color=blue;]#property[/color] [color=blue;]indicator_width[/color]1 1 // толщина будет 1 пиксель потому, что будет пунктир
[color=blue;]#property[/color] [color=blue;]indicator_style[/color]1 [color=navy;]STYLE_DOT[/color] // укажем её пунктирной
[color=blue;]#property[/color] [color=blue;]indicator_level[/color]1 50 // а по средине окна будет проведена тонкая линия
[color=blue;]#property[/color] [color=blue;][color=blue;]indicator_level[/color]color[/color] SILVER // она будет серебристая (светло-серая)
[color=blue;]#property[/color] [color=blue;][color=blue;]indicator_level[/color]width[/color] 1 // толщина 1 пиксель
[color=blue;]#property[/color] [color=blue;][color=blue;]indicator_level[/color]style[/color] [color=navy;]STYLE_DOT[/color] // пунктирная
[color=blue;]#property[/color] [color=blue;]show_confirm[/color] // это для скриптов - подтверждение запуска скрипта.
[color=blue;]#property[/color] [color=blue;]show_inputs[/color] // или запрос ввода параметров
Сообщение изменено: Liv, 27 Май 2007 - 03:06 .
Удачи!
#5
Опубликовано 27 Май 2007 - 05:21
3. Объявления переменных
Каждая переменная, перед использованием должная быть объявлена и назначена. В MQL эти два процесса можно объеденить в одну операцию.
Например:
Здесь объявляется целая (int) переменная igTFrame, которая будет содержать в себе текущий таймфрэйм.
Указание типа перед переменной обязательно, потому, что в данном случае идёт виделение памяти для этой переменной. Существует несколько типов:
Каждая переменная, перед использованием должная быть объявлена и назначена. В MQL эти два процесса можно объеденить в одну операцию.
Например:
MQL
[color=blue;font-weight:bold]int[/color] igTFrame = [color=violet;font-weight:bold]Period[/color]();
Здесь объявляется целая (int) переменная igTFrame, которая будет содержать в себе текущий таймфрэйм.
Указание типа перед переменной обязательно, потому, что в данном случае идёт виделение памяти для этой переменной. Существует несколько типов:
- int - целые числа... это числа без дробей в промежутке от -2147483648 до +2147483647.
- double - числа двойной точности с плавающей точкой. В общем-то, значение этого числа трудно даже представить.... что-то там в степени 308!... а точность обеспечивается 15 значащами цифрами. Хватит на многое.
- bool - логические значения true и false; ну, с этим, думаю всё понятно - всего два значения - истина и ложь.
- string - символьные строки;
- color - целое число, представляющее RGB-цвет; достаточно простое значение переменной, представить можно в нескольких типах:
- литералы; тем, кто привык работать с палитрами, это представление цвета будет наиболее удобным:
C'128,128,128' // серый
C'0x00,0x00,0xFF' // синий - названия цветов - этим пользоваться проще всего:
Red // красный
Yellow // желтый
Black // черный - целочисленные представления
0xFFFFFF // белый
16777215 // белый
0x008000 // зеленый
32768 // зеленый
- литералы; тем, кто привык работать с палитрами, это представление цвета будет наиболее удобным:
- datetime - дата и время, беззнаковое целое число, содержащее количество секунд, прошедших с 0 часов 1 января 1970 года. Для представления в удобочитаемый вид существует множество функций, которые мы будем использовать в своих занятиях.
Удачи!
#6
Опубликовано 29 Май 2007 - 09:46
Переменные (продолжение)
Область видимости
Все переменные имеют область видимости. Этот термин означает, что переменная где-то видна, а где-то может быть не видна. К сожалению, в языке MQL нет специальных инструкций для определения области видимости переменных (глобальная, локальная, частная и пр.). Но тут всё просто!
Если переменная объявлена вначале модуля (вне всяких функций), то она глобальная и видна в любой части модуля. Если переменная объявлена внутри функции, то она будет видна только внутри этой функции и внутри всех вложенных функций.
Примеры:
Есть очень интересная инструкция static. Она предназначена для локальных переменных (для глобальных - не имеет никакого значения). При указании переменной как static, её значение сохраняется до следующего вызова функции.
Пример:
В результате выполения этого скрипта будет выведен через запятую ряд цифр от 1 до 10.
Все параметры, которые опеределяются для функций будут локальными, за исключением передачи переменных по ссылке, но об этом будет далее.
И, наконец, есть ряд переменных, о которых стоит сказать особо: массивы.
Область видимости
Все переменные имеют область видимости. Этот термин означает, что переменная где-то видна, а где-то может быть не видна. К сожалению, в языке MQL нет специальных инструкций для определения области видимости переменных (глобальная, локальная, частная и пр.). Но тут всё просто!
Если переменная объявлена вначале модуля (вне всяких функций), то она глобальная и видна в любой части модуля. Если переменная объявлена внутри функции, то она будет видна только внутри этой функции и внутри всех вложенных функций.
Примеры:
MQL
/*
Здесь объявлена переменная Proba.
Она является глобальной, т.к. объявлена в начале модуля, вне функций и
внешней, т.е. редактируемой пользователем.
*/
[color=blue;font-weight:bold]extern[/color] [color=blue;font-weight:bold]int[/color] Proba=1;
[color=grey]/*
назначаем глобальную переменную Proba1
она объявлена в начале модуля и будет видна
во всех функциях
*/[/color]
[color=blue;font-weight:bold]int[/color] Proba1=2;
[color=grey]/*
В этой функции тоже объявим локальную переменную Proba1
ошибки никакой не будет, но компиллятор предупредит,
что произошло повторное объявление переменной Proba1,
т.к. была объявлена глобальная переменная Proba1
И тут же объявлена локальная переменная Proba2.
*/[/color]
[color=blue;font-weight:bold]void[/color] test1() {
[color=blue;font-weight:bold]int[/color] Proba1=4;
[color=blue;font-weight:bold]int[/color] Proba2=0;
Pr[color=blue;font-weight:bold]int[/color]([color=green]"Proba1="[/color] ,Proba1); // выведется [color=green]"Proba1=4"[/color]
Pr[color=blue;font-weight:bold]int[/color]([color=green]"Proba2="[/color] ,Proba2); // выведется [color=green]"Proba2=0"[/color]
}
[color=grey]/*
А в этой функции просто выводятся значения переменных.
Proba1 выведется нормально, но при выводе
переменной Proba2 произойдёт ошибка
*/[/color]
[color=blue;font-weight:bold]void[/color] test2() {
Pr[color=blue;font-weight:bold]int[/color]([color=green]"Proba1="[/color] ,Proba1); // выведется [color=green]"Proba1=2"[/color]
Pr[color=blue;font-weight:bold]int[/color]([color=green]"Proba2="[/color] ,Proba2); // будет ошибка! Переменная Proba2 не будет найдена!
}
Здесь объявлена переменная Proba.
Она является глобальной, т.к. объявлена в начале модуля, вне функций и
внешней, т.е. редактируемой пользователем.
*/
[color=blue;font-weight:bold]extern[/color] [color=blue;font-weight:bold]int[/color] Proba=1;
[color=grey]/*
назначаем глобальную переменную Proba1
она объявлена в начале модуля и будет видна
во всех функциях
*/[/color]
[color=blue;font-weight:bold]int[/color] Proba1=2;
[color=grey]/*
В этой функции тоже объявим локальную переменную Proba1
ошибки никакой не будет, но компиллятор предупредит,
что произошло повторное объявление переменной Proba1,
т.к. была объявлена глобальная переменная Proba1
И тут же объявлена локальная переменная Proba2.
*/[/color]
[color=blue;font-weight:bold]void[/color] test1() {
[color=blue;font-weight:bold]int[/color] Proba1=4;
[color=blue;font-weight:bold]int[/color] Proba2=0;
Pr[color=blue;font-weight:bold]int[/color]([color=green]"Proba1="[/color] ,Proba1); // выведется [color=green]"Proba1=4"[/color]
Pr[color=blue;font-weight:bold]int[/color]([color=green]"Proba2="[/color] ,Proba2); // выведется [color=green]"Proba2=0"[/color]
}
[color=grey]/*
А в этой функции просто выводятся значения переменных.
Proba1 выведется нормально, но при выводе
переменной Proba2 произойдёт ошибка
*/[/color]
[color=blue;font-weight:bold]void[/color] test2() {
Pr[color=blue;font-weight:bold]int[/color]([color=green]"Proba1="[/color] ,Proba1); // выведется [color=green]"Proba1=2"[/color]
Pr[color=blue;font-weight:bold]int[/color]([color=green]"Proba2="[/color] ,Proba2); // будет ошибка! Переменная Proba2 не будет найдена!
}
Есть очень интересная инструкция static. Она предназначена для локальных переменных (для глобальных - не имеет никакого значения). При указании переменной как static, её значение сохраняется до следующего вызова функции.
Пример:
MQL
[color=blue;font-weight:bold]int[/color] test() {
[color=blue;font-weight:bold]static[/color] [color=blue;font-weight:bold]int[/color] proba;
proba = proba+1;
[color=blue;font-weight:bold]return[/color](proba);
}
[color=blue;font-weight:bold]int[/color] start() {
[color=blue;font-weight:bold]int[/color] proba1=0;
[color=blue;font-weight:bold]for[/color]([color=blue;font-weight:bold]int[/color] i=0;i<=10;i++){
proba1=test();
Pr[color=blue;font-weight:bold]int[/color](proba1,[color=green]","[/color] );
}
[color=blue;font-weight:bold]return[/color](0);
}
[color=blue;font-weight:bold]static[/color] [color=blue;font-weight:bold]int[/color] proba;
proba = proba+1;
[color=blue;font-weight:bold]return[/color](proba);
}
[color=blue;font-weight:bold]int[/color] start() {
[color=blue;font-weight:bold]int[/color] proba1=0;
[color=blue;font-weight:bold]for[/color]([color=blue;font-weight:bold]int[/color] i=0;i<=10;i++){
proba1=test();
Pr[color=blue;font-weight:bold]int[/color](proba1,[color=green]","[/color] );
}
[color=blue;font-weight:bold]return[/color](0);
}
В результате выполения этого скрипта будет выведен через запятую ряд цифр от 1 до 10.
Все параметры, которые опеределяются для функций будут локальными, за исключением передачи переменных по ссылке, но об этом будет далее.
И, наконец, есть ряд переменных, о которых стоит сказать особо: массивы.
Удачи!
#7
Опубликовано 31 Май 2007 - 10:36
Массивы
Массивы - это проиндексированная совокупность однотипных данных.
К примеру, у нас есть данные по цене (свеча):
High = 1.3447
Open = 1.3431
Close = 1.3437
Low = 1.3430
Эти данные можно занести в массив:
В итоге все данные сгруппированы в одном одномерном массиве, где High будет находиться под индексом 1, Open - 2, Close - 3, Low - 4.
Можно все часовые свечи за прошедшие сутки записать в одном массиве, тогда мы получим двухмерный массив, где первым индексом будет номер свечи по-порядку, а вторым - цена:
После этого, получить цену открытия, например, в 12 часов можно очень легко:
Но главное использование массивов в языке MQL - это индикаторы. Вывод графика на экран проводится с помощью связанного массива. Но об этом см. ниже.
Массивы - это проиндексированная совокупность однотипных данных.
К примеру, у нас есть данные по цене (свеча):
High = 1.3447
Open = 1.3431
Close = 1.3437
Low = 1.3430
Эти данные можно занести в массив:
MQL
[color=blue;font-weight:bold]double[/color] ОднаСвеча[]={1.3447,1.3431,1.3437,1.3430};
В итоге все данные сгруппированы в одном одномерном массиве, где High будет находиться под индексом 1, Open - 2, Close - 3, Low - 4.
Можно все часовые свечи за прошедшие сутки записать в одном массиве, тогда мы получим двухмерный массив, где первым индексом будет номер свечи по-порядку, а вторым - цена:
MQL
[color=blue;font-weight:bold]double[/color] Свечи[24][4]; // объявляем массив 24х4
[color=blue;font-weight:bold]for[/color]([color=blue;font-weight:bold]int[/color] i=24;i>0;i--){
[color=blue;font-weight:bold]for[/color]([color=blue;font-weight:bold]int[/color] j=1;j<=4;j++){
[color=blue;font-weight:bold]if[/color] (j==1) Свечи[i][j]=i[color=red;]High[/color]([color=navy;]NULL[/color],[color=navy;]PERIOD_H1[/color],i);
[color=blue;font-weight:bold]else[/color] [color=blue;font-weight:bold]if[/color] (j==2) Свечи[i][j]=i[color=red;]Open[/color]([color=navy;]NULL[/color],[color=navy;]PERIOD_H1[/color],i);
[color=blue;font-weight:bold]else[/color] [color=blue;font-weight:bold]if[/color] (j==3) Свечи[i][j]=i[color=red;]Close[/color]([color=navy;]NULL[/color],[color=navy;]PERIOD_H1[/color],i);
[color=blue;font-weight:bold]else[/color] [color=blue;font-weight:bold]if[/color] (j==4) Свечи[i][j]=i[color=red;]Low[/color]([color=navy;]NULL[/color],[color=navy;]PERIOD_H1[/color],i);
}
}
[color=blue;font-weight:bold]for[/color]([color=blue;font-weight:bold]int[/color] i=24;i>0;i--){
[color=blue;font-weight:bold]for[/color]([color=blue;font-weight:bold]int[/color] j=1;j<=4;j++){
[color=blue;font-weight:bold]if[/color] (j==1) Свечи[i][j]=i[color=red;]High[/color]([color=navy;]NULL[/color],[color=navy;]PERIOD_H1[/color],i);
[color=blue;font-weight:bold]else[/color] [color=blue;font-weight:bold]if[/color] (j==2) Свечи[i][j]=i[color=red;]Open[/color]([color=navy;]NULL[/color],[color=navy;]PERIOD_H1[/color],i);
[color=blue;font-weight:bold]else[/color] [color=blue;font-weight:bold]if[/color] (j==3) Свечи[i][j]=i[color=red;]Close[/color]([color=navy;]NULL[/color],[color=navy;]PERIOD_H1[/color],i);
[color=blue;font-weight:bold]else[/color] [color=blue;font-weight:bold]if[/color] (j==4) Свечи[i][j]=i[color=red;]Low[/color]([color=navy;]NULL[/color],[color=navy;]PERIOD_H1[/color],i);
}
}
После этого, получить цену открытия, например, в 12 часов можно очень легко:
MQL
[color=blue;font-weight:bold]double[/color] ЦенаОткрытия12 = Свечи[12][2];
Но главное использование массивов в языке MQL - это индикаторы. Вывод графика на экран проводится с помощью связанного массива. Но об этом см. ниже.
Удачи!
#8
Опубликовано 01 Июнь 2007 - 04:43
Предопределенные переменные
Наконец, есть переменные, которые называются предопределённые. Они глобальные и обращение к ним возможно в любой части модуля. Вот они:
Наконец, есть переменные, которые называются предопределённые. Они глобальные и обращение к ним возможно в любой части модуля. Вот они:
- Ask
Текущая цена продажи, ask - по-английски - спрашивать, просить... соответственно здесь - это цена спроса. - Bars
Количество баров на текущем графике. Зависит от закаченой истории. - Bid
Текущая цена покупки. Bid - по-английски - приказывать, предлагать цену - это цена предложения. - Close
Это массив, в котором проиндексированы по барам цены закрытия каждого бара текущего графика. Индекс начинается с 0 и заканчивается числом баров текущего графика (Bars-1), т.е. цена закрытия текущего бара будет Close[0]. - Digits
Количество цифр после запятой в ценах. Зависит от используемого инструмента, т.е. если на EURUSD Digits будет равна 4, то на USDJPY - 2. - High
Это массив, в котором проиндексированы по барам максимальные цены каждого бара текущего графика. Индекс начинается с 0 и заканчивается числом баров текущего графика (Bars-1), т.е. максимальная цена текущего бара будет High[0]. - Low
Это массив, в котором проиндексированы по барам минимальные цены каждого бара текущего графика. Индекс начинается с 0 и заканчивается числом баров текущего графика (Bars-1), т.е. минимальная цена текущего бара будет Low[0]. - Open
Это массив, в котором проиндексированы по барам цены открытия каждого бара текущего графика. Индекс начинается с 0 и заканчивается числом баров текущего графика (Bars-1), т.е. цена открытия текущего бара будет Open[0]. - Point
Размер одного пункта ("pip") в текущем инструменте. - Time
Массив, содержащий время открытия каждого бара текущего графика. Данные представляют собой тип datetime и напрямую использовать не очень-то и понятно. Но имеется достаточно много функций преобразования этого числа в удобочитаемую форму. - Volume
Массив, содержащий количество тиков каждого бара текущего графика.
Удачи!
#9
Опубликовано 01 Июнь 2007 - 09:18
4. Объявления функций
MQL является процедурным языком. Это означает, что можно часть кода записать в определённую процедуру, отработать её и пользоваться ей всегда. Только самих процедур (в понимании других языков программирования) здесь нет. Здесь используются функции.
Функции можно разделить на несколько категорий:
При создании пользовательской функции, вам необходимо помнить следующее:
Здесь объявлена пользовательская функция логического типа ([color="#3333FF"]bool[/color]) ПроверкаНаличия. В качестве параметра в неё передается целое значение ([color="#3333FF"]int[/color]), но необязательно, ибо при объявлении параметра происходит назначение по-умолчанию, т.е. если в функцию передали значение, например так:
то это значение присваивается переменной Что_то.
Если ничего не передаётся:
то переменной Что_то присваивается значение по-умолчанию - 0.
Из всех категорий функций, перечисленных мной выше, функция start() является обязательной во всех модулях, кроме библиотек. Созданием библиотек мы займёмся на практических занятиях позднее.
При загрузке (первого обращения) скомпиллированного модуля в память и работу происходит следующее:
При запуске индикатора или советника, после инициализации модуль ждёт следующего тика и при каждом тике выполняется функция start(). После завершения работы (удаление индикатора или советник) выполняется функция deinit(). Функции init() и deinit() являются не обязательными. Например, для скрипта они вообще не нужны и там всё будет исполняться в функции start().
Библиотека служит просто хранилищем объявлений констант, переменных и функций и сама никакой работы не выполняет.
Я описал это для того, чтобы вы представляли себе структуру модуля и очёдность исполнения.
На этом краткий теоретический курс мы закончим и приступим к практическим занятиям.
MQL является процедурным языком. Это означает, что можно часть кода записать в определённую процедуру, отработать её и пользоваться ей всегда. Только самих процедур (в понимании других языков программирования) здесь нет. Здесь используются функции.
Функции можно разделить на несколько категорий:
- общие функции
- преобразования типов
- даты и времени
- информация о счёте
- обработка массивов
- проверка состояния
- файловые
- математические
- строковые
- графические
- пользовательские индикаторы
- технические индикаторы
- доступ к таймсериям
- торговые функции
- операции с графиками
- пользовательские функции
- специальные функции init(), deinit(), start()
При создании пользовательской функции, вам необходимо помнить следующее:
- положение об имени функции такое же самое как и у имени переменной (см. выше)
- функция должная иметь тип так же, как и переменная.
- если функция ничего не должна возвращать (аналог процедуры), то ей присваивается тип void
- все переменные объявленные внутри функции будут локальными и будут видны только внутри этой функции.
- все параметры, обявленные при объявлении функции и переданные ей - будут локальными и, соответственно, будут видны только внутри этой функции за исключением передачи параметра по ссылке (об этом позднее).
- не назначенные параметры передавать в функцию обязательно (позднее мы поговорим об этом).
MQL
[color=blue;font-weight:bold]bool[/color] ПроверкаНаличия([color=blue;font-weight:bold]int[/color] Что_то=0) {
[color=blue;font-weight:bold]bool[/color] ret=[color=blue;font-weight:bold]false[/color];
[color=blue;font-weight:bold]if[/color] (Что_то==1) ret=[color=blue;font-weight:bold]true[/color];
[color=blue;font-weight:bold]return[/color](ret);
}
[color=blue;font-weight:bold]bool[/color] ret=[color=blue;font-weight:bold]false[/color];
[color=blue;font-weight:bold]if[/color] (Что_то==1) ret=[color=blue;font-weight:bold]true[/color];
[color=blue;font-weight:bold]return[/color](ret);
}
Здесь объявлена пользовательская функция логического типа ([color="#3333FF"]bool[/color]) ПроверкаНаличия. В качестве параметра в неё передается целое значение ([color="#3333FF"]int[/color]), но необязательно, ибо при объявлении параметра происходит назначение по-умолчанию, т.е. если в функцию передали значение, например так:
MQL
[color=blue;font-weight:bold]bool[/color] Вопрос = ПроверкаНаличия(1);
то это значение присваивается переменной Что_то.
Если ничего не передаётся:
MQL
[color=blue;font-weight:bold]bool[/color] Вопрос = ПроверкаНаличия();
то переменной Что_то присваивается значение по-умолчанию - 0.
Из всех категорий функций, перечисленных мной выше, функция start() является обязательной во всех модулях, кроме библиотек. Созданием библиотек мы займёмся на практических занятиях позднее.
При загрузке (первого обращения) скомпиллированного модуля в память и работу происходит следующее:
- происходит выделение памяти под объявленные переменные
- присваивание переменным значений, в т.ч. и посредством заголовочного окна, где вам предлагается изменить значания
- определение всех функций
- выполнение функции init()
- выполнение функции start()
При запуске индикатора или советника, после инициализации модуль ждёт следующего тика и при каждом тике выполняется функция start(). После завершения работы (удаление индикатора или советник) выполняется функция deinit(). Функции init() и deinit() являются не обязательными. Например, для скрипта они вообще не нужны и там всё будет исполняться в функции start().
Библиотека служит просто хранилищем объявлений констант, переменных и функций и сама никакой работы не выполняет.
Я описал это для того, чтобы вы представляли себе структуру модуля и очёдность исполнения.
На этом краткий теоретический курс мы закончим и приступим к практическим занятиям.
Сообщение изменено: Liv, 01 Июнь 2007 - 09:24 .
Удачи!
#10
Опубликовано 08 Июнь 2007 - 06:44
Внимание. Для того, чтобы ввести код MQL нужно использовать BB-коды:
[MQL] здесь вы пишите свой код MQL [/MQL]
Удачи!
Посетителей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных пользователей