Программирование на MQL4: основы языка и введение в синтаксис
Здесь мы объявили массив из десяти целочисленных элементов, память под которые выделит компилятор. Заметьте, что наряду с инкрементом, то есть увеличением переменной i на единицу, здесь мы использовали и декремент, то есть уменьшали на единицу переменную j. Любое из трех или все выражения в операторе for(выражение1; выражение2; выражение3) могут отсутствовать.
Обмен данными между структурами
Сегодня мы напишем довольно простой советник, который поможет нам с исследованиями рынка. Все, что вам понадобится, — это терминал Metatrader 4 и mql редактор кода. А также знания о стандартном mql4 методе WebRequest, с которым мы с вами сегодня и будем знакомиться. IVolume – тиковый объём или сколько раз цена меняла значение за время формирования бара. Наиболее распространённым графическим представлением баров являются так называемые «японские свечи».
Многомерные массивы
Мы пишем демонстрационный вариант, поэтому не будем обрабатывать возможные исключения, когда что-то пошло не так и на счёте оказались открыты встречные ордера. Предположим, что в каждый момент времени у нас на счёте открыты ордера только одного направления или нет открытых вовсе. Программы разных видов могут использоваться одновременно и при этом обмениваться данными. С помощью этих приложений программист может механизировать значительную часть торговых операций или создать робот, способный осуществлять торговлю без вмешательства трейдера.
Основной же целью урока было показать, как использование структур может помочь программисту повысить эффективность кода. Впрочем, структуры, представляя собой объекты, объединяющие данные и действия над ними, служат своеобразным «мостиком» между процедурным и объектно-ориентированным программированием. Поэтому привычка использовать в своём коде структурный тип данных послужит хорошей тренировкой для тех, кто планирует освоить ООП.
Цикл for
В таком случае линии дивергенции будут построены только на графике цены. В эту функцию, помимо индекса бара, передаются по ссылке две логические переменные, которые затем можно проанализировать в вызвавшем функцию коде. Одна переменная получает значение true, если на указанном индексе сформирован фрактал вверх, а другая переменная – если фрактал вниз. Мы напишем скрипт, который будет делать разметку фракталов на исторических данных, подобно тому, как это делает встроенный индикатор Fractals.
Пока программа работает, значение глобальной переменной сохраняется. Глобальные переменные объявляются вне функции, обычно в верхней части файла исходного кода. Составление прикладных программ для торгового терминала MetaTrader 4 требует знания языка MQL4. Настоящее учебное пособие представляет собой вводный курс, освоив который, можно самостоятельно создавать эксперты, скрипты и индикаторы, воплощая в них свои идеи – алгоритмы прибыльной торговли.
Глобальные переменные
Давайте в нашей структуре Candle определим метод, который будет получать время открытия свечи, искать её в массиве-таймсерии и заполнять поля структуры данными о найденной свече. Для получения подробной информации о работе клиентского терминала необходимо обратитьсяк “Руководству пользователя” (каталог_терминала\Terminal_russian.chm). Технически внешние переменные также являются глобальными, но глобальные переменные, которые мы обсуждаем в этом разделе, являются внутренними. Это означает, что они не могут быть просмотрены или изменены пользователем. Убедитесь, что идентификатор вашей внешней переменной описывает, что он на самом деле делает.
- При этом блок «Новый тик» соответствует обработчику OnTick(), внутри которого мы будем производить вызов прочих функций.
- При вызове функции Print() сначала происходит увеличение переменной i на единицу, а потом значение i выводится в журнал.
- Функция будет выставлять рыночный ордер на покупку на текущий символ с указанным размером лота, стоп-лоссом и тейк-профитом.
- С помощью этих приложений программист может механизировать значительную часть торговых операций или создать робот, способный осуществлять торговлю без вмешательства трейдера.
Адрес второго элемента – это адрес первого плюс одно смещение на размер первого элемента. Если предполагается, что лот каждого нового ордера или шаг, на котором он выставляется от предыдущего, изменяется в прогрессии, происходит вызов служебной функции GetProgressionMember(). Эта функция возвращает n-ый член арифметической или геометрической прогрессии. Следующая функция определяет направление текущей сетки ордеров. Как только встретится первый ордер, открытый советником, его тип и будем считать направлением сетки.
Нумерация в этом массиве ведётся справа налево, то есть индекс 0 (ноль) в массиве-таймсерии означает данные текущего бара, который соответствует незавершенному промежутку времени на данном таймфрейме. Размер массива-таймсерии можно получить, вызвав функцию iBars, или обратившись к предопределённой переменной Bars. В алгоритмической торговле с помощью баров легко формализовать задачи технического анализа, например, построить трендовую линию или определить дивергенцию цены и индикатора. Многомерные массивы также могут быть статическими или динамическими. Массивы можно передавать в функции только по ссылке, то есть в функцию передаётся только адрес существующего массива, а не его копия.
Здесь мы объявили переменную-счётчик до оператора цикла, а её инкрементацию поместили в тело цикла. Напечатаем в журнал числа от 1 до 5 и от 5 до 1 одновременно в одном цикле. При этом тело цикла должно состоять только из одного вызова функции Print(). Тесты, сделанные в первом приближении, показали работоспособность метода в целом и конкретного советника в частности. Однако окончательные выводы можно делать только по результатам торговли на реальном счёте.
Он включает в себя несколько разных функций, которые программисты могут найти полезными. Как и все включаемые файлы, он находится в папке \experts\include. Например, если переменная типа Double назначена переменной типа Int, forex forum обзор Double будет округлена до ближайшего целого числа. Файлы с расширением .mq4 являются файлами исходного кода.
Давайте начнем с простой функции PipPoint(), которая вычисляет количество десятичных знаков в текущей паре и автоматически настраивается для 3-х и 5-ти значных брокеров. Для всех остальных пар (4 и 5 цифр) функция возвращает 0,0001. Вы даже можете создавать свои собственные константы, используя директиву препроцессора #define. Вкладка «Файлы» в окне «Навигатор» — это простой файловый браузер, который позволяет открывать и редактировать любые файлы MQL в папке \experts. На вкладке «Словарь» имеется встроенная ссылка на MQL, а на вкладке «Поиск» — функция поиска. Окно редактора позволяет открывать сразу несколько файлов.
Надо заметить, что возвращать можно только простые структуры, не содержащие массивы или вложенные структуры. Структуры можно передавать в функции в качестве аргументов, как и обычные переменные. При этом передача структуры в функцию возможна только по ссылке. Следовательно, все изменения параметра внутри функции повлекут за собой изменения переданного аргумента. В нашем примере выделение высот в отдельную структуру избыточно и сделано лишь для демонстрации вложенных структур. Но в случае сложной организации данных, например, иерархической, использование вложенных структур идёт только на пользу.
Для иллюстрации работы оператора немного модифицируем нашу задачу с выводом в журнал целых чисел от 1 до 5. Это всё тот же бесконечный цикл, но выполняется он, пока не будет прерван оператором break или пока не поступит команда от терминала на завершение программы. При вызове функции Print() сначала происходит увеличение переменной i на единицу, а потом значение i выводится в журнал. В данном случае переменная-счётчик последовательно примет значения 1, 3, 5, 7, 9, 11, а в журнал выведет 1, 3, 5, 7, 9. Начнём реализацию алгоритма, опираясь на размещённую выше блок-схему. Каждый элемент этой схемы (блок) выполним в виде функции.
Следовательно, убыток по последним позициям с меньшим лотом будет перекрыт прибылью первых. Недостатком такого способа является недополучение возможной прибыли, хотя риски, конечно же, становятся ниже. Мы видим, что функция возвратила в переменную MovedPoint рассчитанные значения, но при этом переменная P, переданная в функцию в качестве аргумента, не изменилась.
Leave a Reply