Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
MQL5 - Пишем советник на внешнем индикаторе
MQL5 - Пишем советник на внешнем индикаторе
MQL - пишем универсальный советник для MT4 и MT5
MQL - пишем универсальный советник для MT4 и MT5
Приветствую вас, друзья! Согласитесь, очень неудобно, когда есть два терминала - MetaTrader 4 и MetaTrader 5, и вы хотите написать советник для каждого из них, тестировать на обоих, запускать и так далее. Было бы здорово, если бы можно было написать один советник, один файл, который подходил бы и к MetaTrader 4, и к MetaTrader 5.
Сегодня мы с вами постараемся написать такой советник. Я не буду вкладывать какую-то серьезную стратегию, просто покажу сам принцип, как писать под оба терминала одновременно, чтобы советник работал и на MetaTrader 4, и на MetaTrader 5.
Итак, начнем. В MetaEditor встроен такой механизм, как условная компиляция, то есть компиляция в зависимости от версии языка. Определим ордер "stop" для MQL5, соответственно, при помощи условной компиляции мы сможем формировать различные части кода для разных версий. Например, записываем это следующим образом:
Аналогично, пишем код для открытия ордеров в продажу для обоих терминалов.
Далее у нас стандартный метод "OnTick". Здесь мы выполняем нашу логику открытия ордеров. Затем передаем в метод "Buy" параметры цены стоп-лосс и тейк-профит будущего ордера. Аналогично передаем параметры для метода "Sell". В блоке кода для MQL4 у нас тип сигнала определяется случайно, если число делится на 2 без остатка, то у нас тип "Sell", иначе тип "Buy". В блоке кода для MQL5 также генерируем сигнал, используя метод "GetTickCount()".
Вот такой простой алгоритм для примера. Давайте скомпилируем. Если компиляция прошла успешно без ошибок, мы можем протестировать советник в терминале MetaTrader 4.
Для тестирования в MetaTrader 5 создаем пустой шаблон советника в MetaEditor и просто копируем весь текст. Компилируем без ошибок.
Теперь давайте протестируем его в тестере стратегий в MetaTrader 4 и MetaTrader 5. Выбираем валютную пару, устанавливаем параметры тестирования и запускаем тест.
Таким образом, мы с вами написали советник, который одинаково хорошо компилируется и работает в терминале MetaTrader 4 и MetaTrader 5.
Спасибо за внимание, всем пока!
MQL5 - использование экономического календаря в MT5
MQL5 - использование экономического календаря в MT5
MQL5 - Пишем мультивалютный советник для MetaTrader 5
MQL5 - Пишем мультивалютный советник для MetaTrader 5
В этом видео ведущий демонстрирует разработку мультивалютного советника для MetaTrader 5. Начинают с определения исходных параметров и валютных пар для торговли. Они вводят входные параметры для индикатора сигнала входа и подчеркивают важность читаемого кода. Затем ведущий обсуждает создание массивов и функций для обработки сигналов покупки и продажи. Они объясняют объявление и инициализацию массивов, а также обработку ошибок и проверку новых баров. Также объясняется код для определения торговых сигналов на основе значений индикаторов и обработки торговых ограничений. Обсуждается процесс открытия и закрытия ордеров, а также отображение сообщений об ошибках и важность правильного именования и объявления переменных. Видео завершается компиляцией и тестированием советника, где выявляются и исправляются ошибки.
MQL5 Для начинающих Введение
MQL5 Для начинающих Введение
Всем привет! Меня зовут Антон и сегодня я представляю вам видео курс MQL5 для начинающих. Полное название курса - "От самых азов до готового робота". Название было выбрано не зря, так как я сам не люблю учиться на абстрактных примерах типа "Hello, world", а также всяческих там животных или студентах. Поэтому после небольшой теории, мы сразу же начнем создавать рабочий код, который можно будет использовать как самостоятельно, так и в составе других более комплексных решений.
Данное видео является вводным, и в нем я коротко расскажу следующее:
Итак, начнем по порядку. MQL5 - это внутренний язык программирования торгового терминала MetaTrader 5, который разработала сама компания MetaQuotes. Он добавлен в торговый терминал для того, чтобы пользователи могли автоматизировать нужные им рутинные действия, а также самостоятельно расширять функциональность терминала, не прибегая к использованию сторонних решений.
Сам же видео курс рассчитан на людей, которые хотят заняться чем-то из вышеперечисленного, но либо вообще ничего не понимают в программировании, либо знают какой-либо другой язык программирования, но не знают, с какой именно стороны подойти к MQL5. Но эти люди при этом знают, что такое сам терминал и как в нем работать.
Переходим ко второй части, или в этой части немного о том, откуда вообще взялся MQL5 и что он такое. Этот язык программирования создавался не с нуля, а на основе C++. Если в предыдущей версии MQL4 уши C++ торчали из каждого второго куста, то в 5 версии уже никто никого не стесняется, если у функции из MQL5 есть аналог на C++, но его приводят прямо в справочном руководстве. Таким образом, все основополагающие составляющие из плюсов перекочевали в MQL5, а именно: синтаксис, структура кода, типы переменных и особенности работы с функциями. Вот тут правда с оговорками функционал ООП.
Особенности его применения в MQL5 будут рассказаны в соответствующем видео. Прочие чисто технические плюшки расширили функционал родителя фишками, которые будут использованы именно в трейдинге, например, структуры запросов на торговый сервер, получение информации из графика цен и отрисовка на этом самом графике собственных элементов. Много чего еще, но никто не говорит, что это нельзя реализовать через другой язык программирования. Но в MQL5 вся эта реализация предельно упрощена с помощью заранее заложенных в него функций, классов, структур и переменных. То есть вам не нужно каждый раз писать их самостоятельно или постоянно подключать их через функции калькулятора, они уже написаны, стандартизированы и готовы к использованию в любой момент.
Единственное фундаментальное отличие MQL5 от С++ заключается в том, что на последнем можно писать самостоятельные приложения, а MQL5 позволяет создавать только мини и не очень программки, которые будут работать только внутри торгового терминала MetaTrader 5. По аналогии с плагинами для браузеров.
Пожалуй, с болтологии можно за квадратец и перейти к плану видео. Оговорюсь сразу, планы эти не каменные и могут меняться в последней инстанции.
Возможно, какая-то тема потребует более развернутого обзора и займет не одно видео. Может быть, что вы в комментариях сообщите мне, что какую-то тему я раскрыл недостаточно, и не придется отскакивать немного назад. А возможно, еще что-то, как говорится, мы предполагаем, а жизнь располагает.
Сам курс будет поделен на две глобальные части. В первой части, примерно с 1 по 9 урок включительно, будем изучать основы. А во второй части приступим уже непосредственно к созданию рабочего кода для торгового терминала.
Итак, поехали! В первом уроке рассмотрим окно редактора кода, как его вызывать из торгового терминала, пройдемся по настройкам и узнаем, как пользоваться справкой и его особенностями.
На втором занятии мы познакомимся с правилами написания кода и основами любого языка программирования, а именно с переменными. Рассмотрим их типы, как их создавать и какими свойствами они обладают.
В третьем занятии мы рассмотрим арифметические операции и увидим, как они выглядят в виде программного кода. Четвертое занятие будет освещено логическим операциям и их разделению, а также еще немного о переменных.
На пятом занятии познакомимся с массивами и перечислениями. Шестое занятие будет посвящено циклам и как с их помощью можно легко усложнить себе жизнь.
В седьмом занятии мы поближе познакомимся с функциями, а я кратко расскажу о том, что такое ООП и почему оно нам не пригодится.
На восьмом занятии, опираясь на уже пройденный материал, я подробнее расскажу о весьма специфических типах данных, а именно 100к и дата.
И наконец, 9 урок будет посвящен математическим функциям, которые были встроены в MQL5 создателями. Рассмотрим те из них, которые пригодятся нам в типичных случаях их применения, чтобы облегчать повседневный труд MQL5 программиста.
Этим видеоурокам мы завершим изучение основ и далее будем заниматься прикладными задачами. На 10 уроке вы напишите свой первый рабочий скрипт, который реально пригоден в повседневном трейдинге, а также начнем облегчать свою дальнейшую жизнь с помощью создания заготовок, которые будем использовать где только можно. В ходе процесса рассмотрим виды программ, которые можно создавать для торгового терминала.
На 11 уроке мы придумываем в кавычках торговый алгоритм, который впоследствии реализуем сначала в виде кода, а об окончании всего курса на готовом роботе. Почему придумаем в кавычках? Потому что будет использована торговая стратегия, которая известна чуть больше, чем всем, кто в теме.
В двенадцатом видео я немного отклонюсь в сторону и расскажу о разнице между тестированием робота на истории и реальной торговле, и почему по итогу на выходе мы получим аж двух роботов, которые будут вести себя по-разному.
В счастливом тринадцатом уроке мы продолжим писать робота и по ходу дела пропишем в него возможность учитывать показания встроенного в MQL5 индикатора, как дополнительный фильтр для открытия позиций.
На пятнадцатом уроке мы закончим писать код робота, проверим его на демо счете в реальных условиях торговли и защитим нашего робота от несанкционированного использования.
Напоследок, в финальном видео, окинем взглядом проделанную работу, подведем промежуточные итоги и будем рады услышать ваше мнение в комментариях. Пока! Если вам понравилось это видео, ставьте палец вверх, чтобы не пропускать будущие видеоуроки, подписывайтесь на канал и не забывайте про комментарии. Буду рад вашим отзывам и вопросам! Пока!
MQL5 Для начинающих #1. Интерфейс и настройки
MQL5 Для начинающих #1. Интерфейс и настройки
Всем привет! Сегодня приступаем к изучению языка MQL5. Начну с интерфейса окна редактора кода. Кратко пробежимся по настройкам и рассмотрим справочное руководство.
Итак, поехали! Как и любую Windows программу, MQL5 Editor можно открыть с ярлыка на рабочем столе или через меню "Пуск", если таковое есть. Но поскольку сам торговый терминал нам все равно будет постоянно нужен, то я предпочитаю вызывать Editor из самого терминала. Это делается кнопкой на панели инструментов терминала или горячей клавишей F4. Также этой клавишей можно переключаться между окном редактора и окном терминала.
Собственно, вот и сам редактор. В центральной части окна редактора будет располагаться код, который мы будем создавать или исправлять. Внизу находится окно инструментов, из которого чаще всего будем пользоваться вкладкой "Ошибки". А слева находится панель навигации, где можно осуществлять навигацию как по всему рабочему каталогу MQL5, так и по файлам проекта.
Теперь перейдем к настройкам. Они находятся в меню "Сервис" - "Настройки". Итак, приступим. Начнем с вкладки "Общее". Выставляем пробелы. Если эта настройка включена, то при нажатии клавиши TAB вместо служебного символа табуляции будет вставлено некое количество пробелов, которое определяется в соответствующем окне.
Далее, "Автоподстановка скобок". Если настройка включена, то торговый терминал автоматически добавляет соответствующую закрывающую скобку сразу после открывающей.
Подсветка парных скобок. Если настройка включена, то наглядно будет отображаться, какая закрывающая скобка соответствует какой открывающей скобке. Это особенно удобно, когда таких скобок на одном участке кода собралось больше, чем две пары.
Подсветка текущей строки. При включении этой настройки текущая строка редактора будет подсвечиваться серым цветом.
Авто-параметры. Если эта настройка включена, редактор будет подсказывать вам, какие нужны аргументы при вызове какой-то функции.
И, наконец, нумерация строк. Если включена, то все строки в окне редактора, даже пустые, получат свой порядковый номер, который будет отображаться слева.
Теперь переходим к цветам. Отвечает за настройку световой схемы подсветки кода, то есть каким цветом будут выделены в тексте те или иные ключевые элементы программы или не будут, если вы так захотите.
Дальше вкладка "Шрифт". Думаю, все понятно без слов. Единственное, что я увеличил размер шрифта на 16, чтобы вам было удобнее читать с экрана.
Вкладка "Стиль" (Styler). Она служит для того, чтобы редактор автоматически стилизировал написанный код от одного из заранее предопределенных стандартов. Выбрать сам стандарт можно вот в выпадающем окне. Я эти функции не пользуюсь, но возможно кому-то она пригодится.
На вкладке "Компиляторы" показаны те из компиляторов, которые установлены в системе и которые MQL5 Editor может использовать в своих целях. У меня, например, установлена Visual Studio от Microsoft, и соответственно, путь к компилятору указан в соответствующем разделе. У вас эта вкладка может выглядеть по-другому.
"Плагины и профилирование" - честно, я ни разу не видел в MQL5 таких проектов, где подобный функционал был бы реально востребован. Так что насчет удобства использования сказать ничего не могу. Но учитывая, что мы имеем дело не с полноценной интегрированной средой разработки, типа той же Visual Studio, ожидать много от местного инструментария я бы не стал.
"community" - через нее можно подключиться к вашему аккаунту на сайте MQL5.com. Это сайт создателей как торгового терминала MetaTrader5, так и языка программирования MQL5. У меня такой аккаунт есть, но, как видите, я его здесь не подключу и вообще его не разу не подключал и никак по этому поводу не страдаю.
С настройками все, я нажал "Отменить". Вы же, если что-то изменили, нажимаете "ОК".
Теперь переходим к панели инструментов. Как видите, на ней много чего есть, но сейчас большинство из кнопок не активно. Они станут активными, когда мы начнем писать или редактировать код, и будем переходить к ним, когда будем использовать соответствующие функции.
Написание программы начнем с создания нового проекта. Выберем скрипт, нажмем "Далее". В поле "Имя" зададим имя нашего скрипта, пусть будет "тест". Больше ничего не меняем, нажимаем "Готово".
Сверху вниз, серым цветом отображаются комментарии. Они не являются частью кода и при компиляции не учитываются. Комментарии нужны для того, чтобы оставлять пометки для других программистов, которые возможно будут использовать ваш код. Также комментарии можно использовать, чтобы сделать входящие настройки более понятными.
Вот собственно перед нами шаблон проекта типа скрипт. Это самая простая программа, которую позволяет создать MQL5. Давайте пробежимся по этому шаблону.
Сверху мы видим несколько строк, начинающихся с символа решетка (#). Строки с решетками это директивы. Они отвечают за глобальные свойства всему проекту. Их существует довольно много, и мы будем добавлять собственные директивы в наши проекты, но это произойдет несколько позже.
Теперь о том, что значит запись "void OnStart() {}". Вот, сама функция "OnStart". Эта функция "OnStart" - это главная функция в любой программе, не только в MQL5. Вместо "OnStart" имя может быть другим, но смысл всегда один и тот же: выполнение этой функцией начинается выполнение программы. Из нее уже ведется управление выполнением программы, т.е. передается управление программой в другие участки кода, если они есть. Всю программу можно разместить в самой главной функции, но восприятие кода при этом может сильно пострадать. После того, как эти участки будут отработаны, управление снова возвращается в главную функцию. Завершение главной функции без ошибок считается успешным выполнением программы.
Круглые скобки сразу после имени функции говорят нам о том, что в данном случае никакие параметры в эту функцию не передаются. Фигурные скобки после нее говорят компилятору о том, что блок кода, заключенный в них, является частью этой функции. Такие скобки могут быть и в других местах программы, но свидетельствуют они всегда об одном и том же - это некий единый блок кода, который не имеет смысла, если его части будут обрабатываться по отдельности друг от друга.
Теперь по поводу справки. Вызывается она стандартно для Windows приложений горячей клавишей F1. Если вы впервые открываете справку MQL5, то увидите раздел "Оглавление". И вот, так это будет выглядеть. У меня открылась последняя просмотренная страница, но лучше вызывать ее не просто так, а из конкретного места кода. Сейчас я закрою это окно. Вот, поставим курсор на директиву "#include" и нажмем F1. Как видите, мы попали в раздел справки, посвященный именно этому ключевому слову.
Обратите внимание, что размеры руководства справочного дело в том, что принцип 80 на 20 работает здесь на отлично. То есть для решения 80 процентов постоянно возникающих задач требуется всего 20 процентов функционала меток и гитара. За остальным можно и в справку заглянуть. К тому же синтаксис даже часто используемых функций иногда выпадает из головы, так что при помощи справки всегда можно освежить эти сведения в памяти.
Это всего лишь краткий обзор, в будущих видео мы обязательно к этому еще не раз вернемся и рассмотрим содержимое кода программы более подробно. Если вам понравилось видео, ставьте палец вверх, чтобы не пропустить следующее видео, звоните в колокол и не забывайте про комментарии, интересные идеи и предложения. А главная конструктивная критика поможет мне правильно развивать канал. Пока!
MQL5 Для начинающих #2. Синтаксис и переменные. Часть 1
MQL5 Для начинающих #2. Синтаксис и переменные. Часть 1
Всем привет! Продолжаем изучать MQL5 и тему данного видеоурока - переменные, а также попутно изучим основы синтаксиса, то есть правила написания кода языка MQL5.
Тема переменных довольно обширна и я не уверен, что уложусь в одно видео, так что вполне возможно, занятия выйдут в двух частях.
Для начала откроем скрипт, который мы создали на прошлом занятии. Делается это через окно навигации. Из вкладки MQL5, двойным щелчком открываем файл "test.mq5". Если у вас скрипта по какой-то причине нет, то создадим его заново. Через кнопку "Создать", выбираем скрипт, нажимаем "Далее", дописываем в поле "Имя" имя скрипта "test" в нашем случае, и нажимаем "Готово". У меня он просит перезаписать уже существующий файл, у вас, если его не было, попросить, естественно, ничего не будет. Я тоже пересоздан, в конце концов, я еще ничего в него не добавлял.
В прошлом занятии я забыл упомянуть, что торговый терминал MT5 будет искать каждый тип программы в соответствующих этому типу папках торгового терминала. Для скриптов эта папка "Scripts", для индикаторов - "Indicators", для роботов (или как их тут зовут - "экспертов") - "Experts".
С формальностями покончили и можно приступать к главному. Что же такое переменная? Если рассуждать глобально, то переменная это основа всех языков программирования. Потому что неважно, какой алгоритм вы придумали и как вы его реализуете и на каком языке вы это делаете, но в итоге все сведется к обработке переменных. Если смотреть в разрезе практики, переменная это участок или блок или ячейка памяти компьютера, которой мы даем удобное для нас имя, помещаем туда какие-то данные, и затем, используя имя переменной, мы можем эти данные как-то изменять или передавать для дальнейшей обработки.
Давайте наконец дадим переменной! Делается это с помощью записи:
Что означает эта запись? Начну с конца: точка с запятой (;) говорит об окончании оператора. А оператор в свою очередь может содержать в себе одну или несколько операций. В нашем случае это операция создания (или, как принято говорить в программировании, объявление) переменной типа "char" с именем "a".
Немного о именах переменных. Они могут состоять из букв латинского алфавита, при этом заглавные и строчные буквы считаются разными символами. Цифры и знак подчеркивания также допустимы, но служебные символы, такие как знак равенства, звездочка, решетка и др., не могут быть использованы. Имена переменных не могут начинаться с цифры.
Что значит фраза "объявление переменной типа 'char'"? Тут дело в том, что MQL5 унаследовал от Си++ строгую типизацию переменных. Выражаясь проще, когда в программе создается переменная, под нее сразу выделяется некий объем памяти, который зависит от типа значения, которое будет храниться в этой переменной. И в языке MQL5, однажды задав тип переменной, в нее нельзя запихнуть данные другого типа. Как нельзя в принципе. Можно, но только в строго определенной форме, а иначе результаты могут варьироваться от просто неправильной работы нашего робота и до того, что он наторгует нам черти-что.
Чем же такое разнообразие, спросите вы? А я отвечу - вот количество памяти, выделяемое под каждый тип переменной, и соответственно зависимость от количества выделенной памяти. Диапазон значений в каждой переменной будет разным. Например, тип "char" выделяется 1 байт памяти, и диапазон его значений от минус 128 до плюс 127 включая. Тип "short" выделяет уже 2 байта памяти, и диапазон его значений от минус 38 тысяч кажется 80 76 до 38 тысяч 875.
Если вам нужны точные цифры, смотрите справку. Благо, есть возможность перейти сразу к интересующему нас разделу, что я показывал в прошлом видео.
Тип "int" имеет в своем распоряжении четыре байта и его диапазон от минус 2 миллиардов с копейками до плюс 2 миллиардов с теми же копейками минус 1. А самый жирный у нас "long", ему досталась аж 8 бит памяти и диапазон от числа, которое начинается с девятки и имеет за ней еще 18 знаков, и до плюс такого же нецензурного числа минус 1.
Также у них у всех есть беззнаковый вариант, то есть не допускаются отрицательные значения. Вот как они объявляются: "uchar", "ushort" и "ulong". Таким образом, диапазон "uchar" будет от 0 до 255, и памяти ему выделят столько же, сколько и обычному "char". Для остальных беззнаковых, диапазон меняется по тем же правилам.
Небольшая ремарка: английская "u" перед указанием типа, в данном случае, означает "unsigned", то есть беззнаковый. Вы используете их в тех случаях, когда какое-либо значение в программе не может быть отрицательным, например, для подсчета количества ордеров и позиций на торговом счете.
Если поместить в переменную значение, которое выходит за его диапазон, то результат непредсказуем. Точнее, он будет в пределах заданного для переменной диапазона, но при этом каким угодно.
Перед записью урока я провел несколько тестов, и те переменные, которые со знаком, чаще всего выдавали -1, но были и другие варианты. У беззнаковых какой-то закономерности я не заметил.
Теперь закономерный вопрос: а нафига такой зоопарк вообще нужен? Обычный ответ звучит так: для совместимости со старыми стандартами и для экономии памяти. Ну, ладно, старые стандарты оставим в покое, но какая экономия памяти, если в современных даже домашних компьютерах количество оперативной памяти идет на гигабайт? Кстати, память под переменную выделяется именно в оперативной памяти. При таких количествах оперативки разница в два и четыре байта на этом фоне просто потеряется.
Тут палка о двух концах. С одной стороны, торговые роботы не часто работают именно на домашних системах. На ночь эти системы обычно выключаются, и интернет с электричеством могут в любой момент пропасть. Чтобы избежать подобных неприятностей, многие трейдеры арендуют VPS сервер, где стабильность работы намного выше, чем из дома или даже из офиса. Но в аренду эти мощности сдаются не бесплатно, и чем дешевле тариф, тем меньше ресурсов выделено конечному пользователю.
Иногда совсем мизерно. Могу привести свой пример: я являюсь счастливым владельцем виртуальной машины в программе Oracle Always Free. Там у меня запущен терминал MT5 и робот на 3 валютных парах. Так вот, с минимально необходимым для запуска терминала обвесом там бесплатно дали только Linux. Это все хозяйство жрет чуть больше 90 процентов выделенной под виртуальную машину оперативки. Вот где нужно было бы поработать с экономией памяти. О нет, потому что с другой стороны в MQL5 встроена очень много функций, заточенных на связку торговый терминал - торговый сервер, и переделать эти функции нельзя.
А используют они строго определенные типы переменных. Соответственно, для использования этих функций, нам нужно создавать и передавать в них переменные такого же типа. И никуда от этого не деться.
Правда, в данном случае работает принцип диалектического материализма, как известно кому гласит, что любое негативное явление несет в себе позитивный момент, отменяющий негатив. Всего явление, о как руда загнул. Ставьте лайки, если вам так тоже кажется.
В нашем случае позитив заключается в том, что пользоваться всем этим зоопарком нам не придется, так как некоторые типы переменных во встроенных функциях не задействованы. От слова совсем. Это "char", "short" и "ushort". И забегая вперед, один из двух типов вещественных числовых данных "double" используется в очень специфических случаях. "Float" используется чуть чаще, но попадаться в ходе все равно будет редко. А в основном используется "ulong".
Так что получается, что есть 10 представленных нам на выбор числовых типов переменных, а именно 4 целочисленных и 4 беззнаковых вариантов + 2 вещественных. 4 будут невостребованными совсем, а два из целочисленных настолько редко, что делят между собой последнее место в рейтинге популярности.
Теперь перейдем к вещественным типам, или их ещё называют числами с плавающей точкой. А по простому - это дробные числа.
Double - один из них. Во встроенных функциях не попадается, но используется и в хвост и в гриву. Именно в дробных числах идут рыночные котировки и в них же исчисляются объемы сделок, а также прибыль и убытки по ним.
Разница между ними в том, что максимальная точность для float не превышает двадцать четыре знака после точки, а для double - 53 знака. Соответственно, float занимает в памяти четыре байта, а double - два больше.
Отсюда и его название - с использованием вещественных чисел, связан один очень важный момент. Своё время я прочитал множество учебников по MQL4 и MQL5, но ни разу не встречал упоминания об этом. В справке этот нюанс описан, но только один раз, и не все доходят до конца страницы.
Так что я буду первым, насколько я помню. Все дело в особенности хранения вещественных чисел в памяти компьютера. А она рассчитана на работу с целыми числами, и дробные числа хранятся в ней виде степеней целых чисел, иногда далеко не всегда, в виде бесконечных дробей. Например, число 0.25, то есть 0.25, хранится правильно, так как является степенью числа 2 в минус 2 степени, если не ошибаюсь. А вот число 0.3 уже хранится не так хорошо, и при "доставании" его из памяти, у него где-то в восьмом знаке после точки появляется единичка.
Даже для наглядности я пропишу эти числа нашим переменным, соответственно float будет 0.25, double будет 0.3.
Этот недостаток проявляется в тех случаях, когда вы пытаетесь сравнить напрямую 2 вещественных числа. Сам я столкнулся с этой проблемой в мае этого года, когда писал того самого сеточного робота, о котором говорил немного выше, и который сейчас стоит на мощностях Oracle.
Справки приводятся два способа обойти эту проблему, но только из тех, кто не прокрутил страницу до конца, решение в итоге было найдено. Но при этом впустую было потрачено 2 дня и две тонны нервов.
В итоге, всё сводится к тому, чтобы не просто проверять равенство одного вещественного числа другому, а задать более сложные условия.
Сейчас я не буду расписывать этот случай, видео и так затянулось. Но можно вернуться к этому в следующих видеороликах, если интересно.
Под переменной скоро будет вторая часть. В ней поближе рассмотрим не числовые типы переменных, а также попутно пройдемся по синтаксису и терминологии. Она сейчас все. Если не хотите пропустить следующие видео, звоните в колокол, ставьте палец вверх, если вам понравилось это видео.
А если возникли какие-то вопросы или какой-то нюанс нужно рассказать подробнее, пишите в комментариях. Также буду рад вашим оценкам и конструктивной критике. Пока!
Содержание:
00:00:00 - Вступление
00:00:23 - Открываем скрипт
00:01:07 - Структура файлов торгового терминала
00:01:29 - Что такое переменная
00:02:12 - Синтаксис объявления переменных
00:02:45 - Правила именования переменных
00:03:09 - Что такое тип переменной
00:03:59 - Какие типы переменных есть в MQL5
00:04:41 - Типы целочисленных переменных
00:06:53 - Беззнаковые целочисленные типы переменных
00:07:45 - Переполнение возможного диапазона значений
00:08:09 - Зачем так много целочисленных типов?
00:10:15 - Какие типы переменных используются чаще всего
00:11:09 - Вещественные типы переменных
00:12:15 - Особенности хранения в памяти вещественных чисел
00:14:11 - Заключение
MQL5 Для начинающих #2. Синтаксис и переменные. Часть 2
MQL5 Для начинающих #2. Синтаксис и переменные. Часть 2
Всем привет! Это вторая часть видеоурока о переменных в MQL5. В первой части мы разобрали вещественные типы данных, а теперь продолжим с типом string или строковой переменной.
Таким образом, объявим строковую переменную и дадим ей имя. В переменной типа string хранится строка текста, которая представляет собой последовательность символов в формате Unicode.
Работа с строками в MQL5 довольно сложна, так как для этого предусмотрено около 10 специальных функций. Сегодня мы рассмотрим основы и затем вернемся к детальному разбору строк после изучения массивов, циклов и функций.
Теперь перейдем к специальным типам переменных, начнем с типа bool. Этот тип данных занимает 1 байт в памяти и представляет собой логическую переменную, которая может принимать два значения - true (истина) или false (ложь).
Далее объявим несколько переменных типа bool и присвоим им значения. Чтобы присвоить значение переменной, используется операция присвоения, обозначаемая символом равно. Числовая константа представляет собой значение, которое не может быть изменено в процессе выполнения программы.
Для присвоения значения переменной типа float используется числовая константа. Мы можем изменить значение числовой константы, но это уже будет другая константа, а не изменение значения переменной.
Теперь по первым двум переменным были присвоены значения при помощи ключевых слов "true" и "false" соответственно. Не помню, говорил ли я что-то о ключевых словах, но если говорил, то не грех повторить еще раз.
Ключевые слова - это зарезервированные в языке программирования последовательности букв и цифр, которые можно использовать только по прямому назначению и нельзя использовать иначе. В MQL5 таких ключевых слов немного, а вот специальных типов переменных много.
Теперь перейдем к типу "bool". Он занимает 1 байт в памяти и представляет собой логическую переменную, которая может принимать два значения - "true" (истина) или "false" (ложь). В нашем случае, переменные "bu1" и "bu2" были присвоены значения "true" и "false" соответственно.
Ключевое слово "true" означает, что результат некоего действия является истиной, а "false" - ложью. Переменные типа "bool" можно использовать для создания флагов и переключателей, для проверки правильности какого-либо действия и многое другое.
Теперь давайте поговорим о комментариях. В коде есть два типа комментариев: однострочные и блочные. Однострочный комментарий превращает в комментарий всю строку текста, следующую за ним, и обозначается двумя слешами "//".
Вот таким образом можно добавить комментарии к коду, чтобы сделать его более понятным и наглядным. Также комментарии можно использовать для входящих настроек скрипта или робота, чтобы сделать их более понятными.
Теперь давайте исправим ошибки в коде, чтобы программа стала рабочей. Чтобы закомментировать строку кода, нужно поставить перед ней два слеша. Таким образом, ошибки будут исправлены, и программа будет работать без проблем.
В одном из предыдущих видео я рассказывал о столбце. Столбец - это порядковый номер символа с начала строки. То есть отсчет столбцов ведется с нуля. После того как мы исправили ошибку, попробуем запустить компиляцию снова. Как видите, ошибки мы устранили, но остались предупреждения, которые говорят о том, что мы объявили кучу переменных и нигде их не используем. Не будем пока обращать на них внимание, а вернемся к блочным комментариям.
Блочные комментарии позволяют за комментировать не только набор строк, но и часть кода в середине одной строки. Вид блочного комментария выглядит так: /* ... */. Все, что находится между этими символами, будет являться комментарием.
Теперь давайте объявим еще один специальный тип переменной - "datetime". Дату и время хранятся в этой переменной в виде количества секунд, прошедших с 0 часов 1 января 1970 года. Переменные этого типа предустановлены в MQL5 и могут быть использованы для определения момента открытия нового бара, задания торгового времени и времени перерывов в торговле.
И последний из специальных типов переменных - "color". Он представляет собой описание цвета и может быть присвоен тремя разными способами: с использованием ключевых слов для именованных цветов, в виде набора трех десятичных чисел или одного шестнадцатеричного числа.
И, наконец, о том, почему не нужно оставлять переменные без явного присвоения им значений. Если вы не инициализируете переменную явным образом, ей будет присвоено случайное значение из доступных для ее типа. Это может привести к ошибкам и некорректной работе программы.
Так что будьте внимательны и правильно инициализируйте переменные перед их использованием. В следующей части урока мы вернемся к типам переменных и более детально разберем перечисления. Пока все, спасибо за внимание! Если понравилось видео, ставьте лайк, комментируйте и не пропустите следующую часть. Пока!
MQL5 Для начинающих #2. Синтаксис и переменные. Часть 3
MQL5 Для начинающих #2. Синтаксис и переменные. Часть 3
Всем привет! Сегодня я завершающее видео про синтаксис и переменные в языке программирования MQL5. Начну с того, что обещал показать, но так и не показал в предыдущем видео - как вставлять блочные комментарии в середину выражения. Делается это просто: открываем блочный комментарий /* и закрываем его */. Все, что находится между этими символами, становится комментарием.
Теперь перейдем к составным типам данных, или как их называют в MQL5 - объектам. Это особенный вид данных, который позволяет создавать свои собственные переменные и функции внутри объекта. Основная программа может создавать экземпляры этого объекта, которые являются копиями объекта, и работать с ними по строгим правилам, которые мы устанавливаем сами. После того, как экземпляр объекта становится ненужным, его можно уничтожить, то есть удалить из памяти.
Теперь перейдем к объявлению и присвоению значений переменным. Можно объявлять несколько переменных одного типа в одном операторе, разделяя их запятой. Также можно инициализировать переменные в том же операторе, указывая значения после знака равно.
Для демонстрации работы с переменными используем функцию print, которая выводит информацию в журнал торгового терминала. Вызов функции выглядит так: print(значение). Можно указать несколько значений через запятую, чтобы выводить разную информацию.
Теперь эта функция, когда наш скрипт будет запущен на графике торгового инструмента, выглядит нам в виде текста, содержащегося в переменной "а". То есть мы выводим в журнал два значения - текстовую константу в кавычках и переменную "а". Значения разделяются запятыми и будут выведены в том порядке, в котором идут в скобках, слева направо.
Количество пробелов за пределами комментариев роли не играет, я их поставил для того, чтобы вам было удобнее читать код с экрана. Если вам они мешают, вы можете их не ставить.
Теперь скомпилируем наш скрипт. Как видим, мы получили два предупреждения о том, что переменные "b" и "c" не инициализированы. Но забегая вперед, скрипт отработает корректно.
Предлагаю еще вызвать аналогичные функции для переменных "b" и "c", чтобы наглядно увидеть, как инициализируется переменная, которой мы явно не присвоили значение.
Теперь снова компилируем программу. Как видим, предупреждение все еще осталось, поскольку мы использовали переменные в функции "print".
Теперь переходим в торговый терминал. Запускаем наш скрипт. Как видите, все три переменные вернули "5", хотя переменные "b" и "c" мы никаких значений явно не задавали.
Для чистоты эксперимента предлагаю немного поиграться с нашими переменными. Возвращаемся в терминал и теперь переменную "а" мы явно не инициализируем, переменную "b" инициализируем значением "10", а переменной "c" ставим, как было.
Еще раз компилируем программу, переключаемся в терминал, очищаем журнал, чтобы не было лишнего, и опять запускаем наш скрипт.
Как видите, результаты немного изменились. Теперь переменная "а" вернула нечто совсем удаленное от реальности, а переменные "b" и "c" вернули "10" и "5".
И чтобы завершить наш эксперимент, вернемся в код и еще раз изменим значение наших переменных. На этот раз переменные "а" и "b" не будут иметь никаких значений, а переменной "c" мы присвоим значение "15".
Перед компиляцией программы еще раз вернемся в терминал, очистим журнал и запустим наш скрипт.
Как видим, результаты снова изменились. Теперь переменные "а" и "b" не имеют значений, а переменная "c" вернула "15".
Итак, что мы можем сделать вывод из нашего маленького эксперимента? При объявлении в одну строку нескольких переменных, те, которые мы инициализировали явно, имеют присвоенные им значения, а те, которые мы явно не инициализировали, автоматически получают значение предыдущей переменной.
Также стоит упомянуть об очередности выполнения команд в программе. Операторы в ходе программы выполняются последовательно слева направо, при разрыве строки от внизу считается как он справа в глобальном смысле. Это значит, что всю программу теоретически можно записать в одну строку, за исключением процессорных директив.
Перейдем в терминал, почистим журнал. Давайте я немножко даже расширю его окно и запустим тест на выполнение.
Как видите, теперь все соответствует нашим пожеланиям, которые мы выразили в виде программного кода. Давайте вернемся в наш редактор.
Чуть раньше я обронил фразу о том, что компилятор присвоил значение одной переменной другой переменной. До присваивать переменным можно не только константы, но и значения других переменных, а также результаты одной или нескольких операций. Вторым мы начнем заниматься со следующего занятия.
А сейчас первое я покажу. Давайте присвоим нашей переменной "с" значение переменной "а". Делается это вот так:
Теперь опять скомпилируем нашу программу. Переходим в терминал и запускаем наш скрипт.
Как видите, переменная "с" вернула значение "5", точно такой же как и у переменной "а". Теперь это не случайность, а прописанная нами истина.
Но если мы попытаемся сделать то же самое, поменяв переменные "а" и "с" местами, то у нас ничего не выйдет. Возвращаемся в редактор и попробуем вернуть нашей переменной "с" ее значение "15", а переменной "а" присвоим значение переменной "с".
Компилируем это дело. Как видите, компилятор выдал ошибку, а именно "необъявленный идентификатор "с"". Мы же помним, что выполнение программы слева направо, и в этом случае переменная "с" еще не объявлена, а мы уже и пытаемся куда-то использовать ее. Вот компилятор возмутился этой подлостью, хорошо, еще что морду не набил. Ладно, приведем все в порядок и перейдем к следующей теме.
Как впихнуть невпихуемое, или о том, как переменной одного типа присвоить значение другого типа. Для демонстрации нам потребуется еще одна переменная, и будет она типа "чар". Давайте ее и создадим, на этом пока что не будем ничего присваивать. Также стоит убрать лишние вызовы функции "print".
Немного теории. Преобразование одного типа данных в другой называется приведением типов и производится он двумя способами - неявным и явным. Первым уже познакомились, функции "print", если вы заметили, передаем мы не числа, прочего, переменную типа "int", а компилятор уже без наших указаний преобразуют ее содержимое в текст и выводит в журнал. Вообще, неявное приведение стоит использовать только тогда, когда мы идем от простого к сложному. В других случаях компилятор нас честно предупредит. Давайте все-таки присвоим нашей переменной "d" какое-то значение, например 120. И следующим действием переменной "a" присвоим значение переменной "d". Вот так.
И скомпилируем всю программу. Как видите, у нас нет ни ошибок, ни предупреждений. Почему так? Потому что тип "чар" имеет меньший диапазон допустимых значений, чем тип "int", и поэтому любое правильное значение типа "char" будет правильным и для типа "int". Давайте проверим. Переходим в торговый терминал и запускаем наш скрипт на выполнение.
Как видите, переменная "a" теперь равна 120. А вот если попробуем в обратном порядке, все будет уже не так радужно. Возвращаемся в наш редактор и меняем переменные "a" и "d" местами. Запускаем компиляцию.
Как видите, появилось предупреждение, которое говорит нам о том, что возможна потеря данных в процессе конвертации. В нашем случае все пройдет гладко, потому что 5 входит в диапазон допустимых значений для "char". Но если мы изменим значение нашей переменной "a", скажем, на миллион, и после этого скомпилируем нашу программу, мы все равно получим лишь предупреждение. А вот на результат сейчас смотрим.
Предварительно немного подправив нашу функцию "print", компилируем программу. Переходим в терминал и запускаем.
Как видите, предупреждение действительно исчезло. Попробуем еще раз запустить на выполнение.
Чистим журнал, запускаем на выполнение и получаем то же самое. Так зачем это нужно, если результат все равно неправильный? Иногда бывает и нужно, например, если вы хотите избавиться от дробной части вещественного числа. Спойлер, такая потребность у нас возникнет вот тут.
Явное приведение типов избавит нас от ненужного предупреждения при компиляции. Давайте на это посмотрим. Здесь мы пока что закомментируем явное приведение, корректируем наше значение "d" - да, допустим 7.25. Затем вместо переменной "a" используем нашу переменную "d". Похоже, где-то пользуемся типами "char" и "float". Теперь компилируем нашу программу.
Как видите, та же самая ошибка. В данном случае мы лишились дробной части, и осталась только семерка. Давайте посмотрим.
Как видите, осталась именно семерка. Но если мы не хотим видеть предупреждение и точно уверены в том, что все идет как надо, добавляем явное приведение типов.
И предупреждение исчезает, а результат при этом остается прежним.
Также есть много предустановленных функций, которые преобразуют один тип данных в другой, но они не тема нашего сегодняшнего урока и используются довольно редко. Так что, если когда-то в будущем какая-то из них там понадобится, я остановлюсь на ней подробнее.
Ах да, забыл упомянуть. Все целочисленные типы неявно приводятся к вещественным, а все числовые типы без потерь. С приведением типов закончили, и под конец видео упомянул про такое понятие, как область видимости и срок жизни переменных. Беда только в том, что наглядно показать это сейчас не получится, но когда дойдем до логических ветвлений, там нам откроется широчайший оперативный простор для подобных демонстраций. А пока что просто сделаете себе пометку о том, что такое есть в природе, и если я вдруг забуду, напомните мне об этом в комментариях. Наконец-то с переменными закончили.
Если вам понравилось это видео, ставьте палец вверх, чтобы не пропустить следующие. Звоните в колокол, не забудьте подписаться на канал. А также прошу оставить комментарий - буду рад вашим оценкам и конструктивной критике. Всем пока!
MQL5 Для начинающих #3. Арифметические действия
MQL5 Для начинающих #3. Арифметические действия
Всем привет! Продолжаем изучать язык программирования MQL5, и сегодня мы возвращаемся в школу и будем учить арифметику, а точнее арифметические операции в MQL5. Какие они бывают и как они правильно реализуются.
В ходе начнём с самого простого арифметических действий, всего 4: сложение, вычитание, умножение и деление. До меня доходил слух о том, что с недавних пор арифметическим действиям относятся возведение в степень и извлечение корня, но в логике MQL5 все по-прежнему.
Прежде чем начать, давайте я почищу наш скрипт от лишнего и сделаю это самым радикальным способом. Также, я очень люблю копировать вот этот комментарий и вставлять его таким образом, чтобы отделить фигурные скобки главные функции под кода программы, просто для собственного удобства.
А для начала давайте создадим несколько переменных, которые и будем мучить на протяжении всего урока. И заодно готовлю функцию print, чтобы на это не отвлекаться. Готово.
Теперь можно сразу переменным "a" и "b" присвоить значения. Пусть "a" будет 10, а "b" будет 5. И в дальнейшем переменной "c" мы будем присваивать результаты действий над переменными "a" и "b".
Но для начала, кое-что о правилах. Как и во всей математике в MQL5 арифметические действия выполняются последовательно, слева направо. Выше приоритет имеют действие в скобках, затем умножение и деление, и только потом сложение и вычитание. Кстати, как записываются арифметические действия? Также, как и обычно: "+" - это сложение, "-" - это вычитание, "*" - это умножение, и "/" - это деление. А еще есть "%", который означает остаток от деления. Давайте все их рассмотрим по очереди.
Наверное, нужно подготовиться немного по-другому. Сейчас я это и сделаю, это нам пригодится чуть позже. Итак, начнем. Сначала присваиваем переменной "c" результат сложения переменных "a" и "b", и выводим результат в журнал. Затем переменной "c" мы присваиваем разницу между "a" и "b" и опять же выводим ее в журнал. И наконец, переменной "c" мы присваиваем результат умножения переменных "a" и "b", и снова функции print выводим это в журнал.
Чуть сложнее нам понадобится еще одна переменная, назовем ее "abu", и в нее мы будем выводить результат деления "a" на "b". Я тоже поставил лирический символ. Все готово, можно компилировать, что и сделаем.
Как видим, нет предупреждений, нет ошибок. Переходим в терминал и запускаем наш скрипт на выполнение. Как видите, все правильно пока что.
А теперь попробуем извлечь остаток от деления в переменную.
Переходим обратно, опять же используем самый распространенный метод программирования - звездочку (*). У меня им на процент (%). Вот так. Соответственно, корректируем нашу функцию print.
Компилируем. Как видите, предупреждение мы не получили, так что возвращаемся в терминал, очищаем журнал и запускаем наш скрипт на выполнение. Как видите, мы получили то, что должны были получить - а именно 0, потому что 10 делится на 5 без остатка, и соответственно, остаток этот равен нулю.
Но помимо стандартных форм записи арифметических действий, мы можем использовать и специально для программирования сокращенные. Давайте вернемся в терминал и попробуем их, так сказать, на зуб. Для начала, я за комментируют то, что нам сейчас не понадобится.
Давайте представим себе такую картину: мы хотим присвоить новое значение не переменной "c", а переменной "a", и при этом нам нужно использовать текущее значение переменной "a". Мы можем сделать это вот так. И соответственно, исправив функцию print, чтобы она выводила новое значение переменной "a".
Компилируем. Нам выдало предупреждения по поводу того, что переменная "c" нигде не используется, но мы пока что его проигнорируем. Переходим в терминал, очищаем наш журнал и запускаем наш скрипт на выполнение. Как видите, мы получили то, что должны были получить - а именно 15.
Но это же выражение можно записать и по-другому. Давайте вернемся в терминал и запишем его, как правильно у программистов, а именно вот так: "a += b". И соответственно, ставим функцию print.
Компилируем, возвращаемся в терминал и опять запускаем тест. Как видите, опять получаем ровно то же самое. То же самое верно и для других арифметических действий, только плюс мы меняем на тот символ, который нам нужен.
Где это можно использовать? Например, при подсчете прибыли по нескольким позициям. Давайте перейдем в редактор и я распишу, как это будет выглядеть.
Допустим, у нас есть переменная "total_profit", в которой мы будем ходить нашу прибыль. И каждый раз, когда мы находим нужную нам позицию, из которой нам нужно изъять показатели прибыли, мы не пишем что-то наподобие "total_profit = total_profit + profit;". А делаем эту запись проще, а именно вот так: "total_profit += profit;". Вот как это будет выглядеть.
Кстати, вы такую функцию в будущем напишем, и не пока что это нам не нужно, его его закомментируем. А теперь пойдем дальше.
Еще один арифметический фокус: что если нам просто нужно увеличить или уменьшить значение переменной на единичку? Для такой операции есть своя запись. Давайте попробуем. Это для того, чтобы увеличить переменную на единицу.
Соответственно, сейчас я разкомментирую "a" и "b" вручную. Сделал вот так. Соответственно, поставлю нашу функцию "print" при записи "a++" - именуется как инкремент, а при записи "b--" - декремент. Чуть было вероятным "экскременты", но это был бы наглый проход. Так как операции на самом деле крайне полезны. Давайте посмотрим, как они выглядят и давайте посмотрим, как выглядят результаты этих операций.
Компилируем полный обратно в терминал и запускаем наш скрипт. Как видите, переменная "a", которая была равна 10, превратилась в 11 - так мы и инкрементируем. Переменная "b" из пяти превратилась в 4, так как мы декрементируем.
Где это пригодится? Да практически везде! Нужно посчитать количество позиций определенного направления на конкретном инструменте. Это инкремент. Нужно перебрать все закрытые позиции от сейчас и до понедельника - это декремент. В общем, любые счетчики и обратный отсчет и с их помощью реализуются намного компактней, чем если бы их не было.
Дальше по вкусу, насмотритесь и, я уверен, даже проникнитесь. Для умножения и деления и остатка от деления аналогичных климентов нет.
Также не лишним будет упомянуть, что делить на 0 нельзя. Помню, даже компилятор выдавал предупреждение, если какое-то действие потенциально могло привести к подобному. В нашем случае такого не случилось, так как мы проводили довольно простые цепочки действий. Но в больших программах, где одной переменной приходится по многу раз присваивать самые разные значения, нужно быть внимательными.
И под конец расскажу, почему же нельзя делить на 0. Все-таки это программирование, а не обыкновенная математика. На самом деле и в математике у каждого действия должно быть проверочное действие. Поэтому вот такая вот запись "c = 4 / 2" будет проверяться соответствующей записью "4 = 2 * c". В данном случае это не программный код, а просто математическая запись. И если вдруг вместо "c" окажется 0, то 4 мы в итоге не получим никогда, так как свойства числа 0 однозначно при умножении на него, чтобы то ни было, всегда получается 0. Программирование тоже приходит именно с эту сторону, но делает заход с другого фланга.
Любой программный код рано или поздно переводится в двоичную систему счисления, так как центральный процессор понимает только ее. А в двоичной математики нет таких действий, как вычитание и деление. Следовательно, рано или поздно наша запись придет вот к такому виду. Свойства числа 0 везде одинаковы.
Вот такие пирожки с котятами. Как видите, арифметика это просто. Тут скорее дело в опыте, с которым приходит понимание, что и где из представленного использовать эффективнее.
На данный момент все. Если вам понравилось видео, ставьте палец вверх. Чтобы не пропустить следующие, звоните в колокол. А в комментариях пишите свое мнение об увиденном и услышанном, и не забывайте подписаться на канал. Ведь чем нас больше, тем искать ответы на постоянно возникающие вопросы легче. Всем пока!