Перейти к содержимому

Theme© by Fisana
 

Фотография
* * * * * 4 Голосов

Азы программирования на MQL4


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 45

Опрос: Азы программирования на MQL4

Мне эта тема интересна

Вы не можете видеть результаты проса пока не проголосуете.
Голосовать Гости не могут голосовать

#1 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 12 November 2010 - 14:04

Многие работающие на МТ4 считают что обучиться языку программирования MQL4 и самому писать торговые роботы - штука невероятно сложная. Однако это не так и, при желании, вы можете освоить язык в достаточно короткое время, 3 - 6 месяцев. Я понимаю, что совершенству нет предела, однако, для дальнейшего совершенствования в интернете существуют специализированные ресурсы к которым вы и сможете обратиться в дальнейшем. Моя же цель - показать вам с чего начать и помочь сделать первые шаги.

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

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

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

Ссылки по ключевым словам:

Вывод текстовой информации, Имена, Исходный код, EX4, Комментарии, Компиллятор, Константа, Логические операции, Log-файл, MQ4, Оператор, Оператор присваивания, Оператор Alert(), Оператор Comment(), Оператор Print(), Оператор switch(), Операнд, Операции отношения, Переменная, Перенос строк, Стиль программирования, Типы данных, Условный оператор if-else, Функция

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

Для того чтобы вставить в пост кусок кода выберите иконку <> в топе окна редактора поста.

Прикрепленные файлы


  • sansanyh это нравится

 
 

#2 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 12 November 2010 - 14:24

В торговый терминал MT4 встроен редактор, который создаёт текстовые файлы в формате .MQ4. Отличие этого редактора от обычного текстового состоит в том, что он умеет распознавать "слова" из которых состоит язык MQL4 и подсвечивать их разными цветами, а так же давать исчерпывающие консультации по различным вопросам составления программы.

Давайте посмотрим, как можно добраться до этого редактора.

Изображение

Самый простой путь, это нажать клавишу F4, при этом откроется пустое окно редактора. То же самое можно проделать нажав жёлтую кнопку с восклицательным знаком. Однако в вашем терминале уже существуют какие-то программы и вы можете просмотреть их коды выбрав в навигаторе нужную программу правой кнопкой мыши и выбрав пункт "изменить" (изменять пока ничего не рекомендую). 
  • sansanyh это нравится

#3 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 12 November 2010 - 14:49

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

*При необходимости выберите язык в меню вид.
  • sansanyh это нравится

#4 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 12 November 2010 - 15:05

 Выберем создание нового документа (программы). На экране появится следующее меню:
Изображение
Выбирая тот или иной пункт, вы определяете шаблон структуры программы, который сгенерирует редактор. То есть редактор откроет окно, в котором уже будет некоторый текст, предопределённый выбираемым шаблоном.

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



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

Экспериментируйте, НО! не изменяйте уже существующие файлы и не трогайте в них ни единой точки, запятой или скобки.
  • sansanyh это нравится

#5 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 14 November 2010 - 18:11

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

Установите переключатель в положение "пользовательский индикатор" и нажмите кнопку "Далее".  Появится окно:

Изображение

В поле "имя" введите имя вашего первого индикатора -  "Example_1" или любое другое имя латинскими буквами.
В поле "автор"  -  ваше имя (можно ничего не менять).
В поле "ссылка" - ссылку на ваш сайт (можно ничего не менять).
  • sansanyh это нравится

#6 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 14 November 2010 - 21:45

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

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

Пусть это выглядит так:

Изображение

теперь нажмите кнопку "далее" .

Откроется следующее окно:


Изображение

Если вы установите галочку в поле индикатор в отдельном окне, то индикатор будет отображаться не в окне основного графика, как, например МА, а в подокне, как, например, Stochastic.

Минимум и максимум задают верхний и нижний пределы шкалы индикатора. Так Stochastic имеет нижний предел = 0, а верхний = 100;


Изображение

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

Все данные, которые мы занесли в эти две последние формы в будущем можно будет легко изменить!

Нажимаем кнопку готово...

  • sansanyh это нравится

#7 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 14 November 2010 - 22:17

 Откроется окно редактора с текстом, который определён нашими предыдущими манипуляциями, давайте посмотрим, что получилось.


//+------------------------------------------------------------------+
//|                                                    Example_1.mq4 |
//|                                              valenok2003@mail.ru |
//|                                             http://fxgeneral.com |
//+------------------------------------------------------------------+
#property copyright "valenok2003@mail.ru"
#property link      "http://fxgeneral.com"

#property indicator_separate_window
#property indicator_minimum 1
#property indicator_maximum 10
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int       ExtParam1=1;
extern bool      ExtParam2=true;
extern double    ExtParam3=1.5;
extern string    ExtParam4="Привет!";
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+



  • sansanyh это нравится

#8 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 14 November 2010 - 22:39

 Компьютер  не может понять человеческий язык в силу его(человеческого языка) неоднозначности поэтому для общения с компьютером (в рамках MT4) был разработан специальный, логически выверенный и однозначный язык MQL4, программа написанная на нём называется исходным кодом  и хранится в файлах с расширением MQ4. Исходный код понимает специальная программа, которая называется компиллятор. Она читает текст, который мы написали, проверяет его на наличие ошибок и, если ошибок нет, преобразует его в исполняемый файл (расширение EX4), который уже может быть запущен в терминале. 
Прежде чем продолжить,  покажу очень полезную и приятную возможность редактора. Установите курсор на любой текст в окне редактора подсвеченный синим или фиолетовым цветом и нажмите функциональную клавишу F1. В информационном окне, внизу окна редактора, появится исчерпывающая информация касательно текста на который установлен курсор.


Теперь давайте посмотрим на наш код, в самом начале мы видим:
//+------------------------------------------------------------------+
//|                                                    Example_1.mq4 |
//|                                              valenok2003@mail.ru |
//|                                             http://fxgeneral.com |
//+------------------------------------------------------------------+
 

Действие двойного слэша распространяется на единственную строку и только на те символы которые находятся правее него.

Комментарии

// Строки, которые начинаются с двойного слэша, компьютером игнорируются и являются комментариями. Комментарии нужны для   
//описания программы с целью более простого её понимания или для исключения некоторых строк кода из программы без их 
//удаления.
//Если же вы хотите написать многострочный комментарий, то в начале него необходимо поставить  /*  а в конце  */

/*  это выглядит так
и эти строки тоже 
являются комментариями
до закрывающих символов */


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

Установим курсор на слово #property и нажимём <F1> 

Как видите в информационном окне появилась подробная информация. Таким образом, моя задача сводится к тому, чтобы показать вам город под названием MQL4 с высоты птичьего полёта, а ключ от каждого дома я вам уже дал и ключ этот - клавиша <F1>. 
  • sansanyh это нравится

#9 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 15 November 2010 - 09:41

Рассмотрим немного подробнее то что у нас получилось, текст можно разбить на 4 части.

Заголовок
//+------------------------------------------------------------------+
//|                                                    Example_1.mq4 |
//|                                              valenok2003@mail.ru |
//|                                             http://fxgeneral.com |
//+------------------------------------------------------------------+
#property copyright "valenok2003@mail.ru"
#property link      "http://fxgeneral.com"

#property indicator_separate_window
#property indicator_minimum 1
#property indicator_maximum 10
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int       ExtParam1=1;
extern bool      ExtParam2=true;
extern double    ExtParam3=1.5;
extern string    ExtParam4="Привет!";
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

Функция init 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }

Функция deinit
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }


Функция start

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   
//----
   return(0);
  }


  • sansanyh это нравится

#10 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 15 November 2010 - 10:52

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

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

В общем случае функция имеет такой вид:

my_function()
{
   //код функции, он может состоять из большого количества строк
}
 


Здесь имя функции -  my_function.

Использование знаков подчёркивания <_> в именах считается в программировании моветоном, однако лично мне так удобнее. И на мой взгляд увеличивает прозрачность и читаемость программ. То, как программист пишет программу, как расставляет различные служебные символы назвается Стилем программирования и у каждого программиста он свой. С самого начала обучения необходимо вырабатывать правильный стиль, это облегчит понимание программы как другими программистами, так и самим автором. Например, как элемент стиля, имена функций я всегда пишу только строчными буквами. И если где-то в моей программе встречается имя написанное строчными буквами, то можно предположить, что это имя функции.


Имена
ОЧЕНЬ ВАЖНО! имена my_function, My_function, My_Function, MY_FUNCTION - это, с точки зрения компиллятора, четыре совершенно различных имени, точно также как буква "а" строчная для него не равна букве "А" прописной. Необходимо всегда помнить об этом! Это касается всех возможных имён в MQL4. 


  • sansanyh это нравится

#11 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 15 November 2010 - 15:29

Итак в нашем шаблоне есть три функции


int init()
  {
  // текст программы
   return(0);
  }
int deinit()
  {
  // текст программы
  return(0);
  }
int start()
  {
  // текст программы
  return(0);
  }
Эти три функции стандартны и необходимы для правильной работы индикатора. Все они должны присутствовать в вашей программе.

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

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

И, наконец, функция start(), в ней расположен основной код программы. Эта функция вызывается терминалом для исполнения на каждом тике.
  • sansanyh это нравится

#12 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 15 November 2010 - 17:28

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

В языке MQL4 различают следующие типы данных:

  • int - целые числа, в том числе и отрицательные. Например 1, 2, 3, -5, ..... и т.д. 
  • double - действительные числа, в том числе и отрицательные.  Отличаются от целых тем, что имеют дробную часть. Например 1.0, -3.14, 22.00 .... Обращаю ваше внимание, что целая часть отделена от дробной точкой, а не запятой.
  • bool - значения логического типа - могут принимать только два значения false и true (ложь и истина).  
  • string - значения строкового типа - обычная строка "заключённая в кавычки"  
  • color - значения цветового типа, существуют различные способы их описания, мы рассмотрим один, например значение Red соответствует красному цвету, Blue - голубому, Green - зелёному, Yellow - желтому.  Более подробно описание значений цветов вы можете посмотреть в учебнике в таблице цветов.  
  • datetime - значение даты и времени - этого типа мы пока не будем касаться. 


  • sansanyh это нравится

#13 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 15 November 2010 - 18:56

Вернёмся к нашим функциям, рассмотрим, например, функцию start()


int start()
 {
   //код программы
   return(0);
  }

перед именем функции стоит int, это означает, что в результате выполнения кода программы функция сформирует и вернёт результат типа int, то-есть целое число. 

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

#14 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 15 November 2010 - 19:00

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

Теперь давайте вернёмся к заголовку.



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


//+------------------------------------------------------------------+
//|                                                    Example_1.mq4 |
//|                                              valenok2003@mail.ru |
//|                                             http://fxgeneral.com |
//+------------------------------------------------------------------+
#property copyright "valenok2003@mail.ru"
#property link      "http://fxgeneral.com"

#property indicator_separate_window
#property indicator_minimum 1
#property indicator_maximum 10
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int       ExtParam1=1;
extern bool      ExtParam2=true;
extern double    ExtParam3=1.5;
extern string    ExtParam4="Привет!";
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

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

Более подробно строки включаемые в заголовок мы будем рассматривать по ходу дальнейшего изложения материала.
  • sansanyh это нравится

#15 valenok2003

valenok2003

    Пользователи

  • Заблокированные
  • PipPipPipPipPipPipPipPipPipPipPip
  • 606 сообщений

Отправлено 15 November 2010 - 20:50

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

Константа.

Иногда нам будут нужны одни и те же данные, которые никогда не изменяются по ходу исполнения программы. Такие данные называются константами (от латинского слова constanta — постоянная, неизменная).  Константами могут выступать сами данные, например число или строка символов. Однако, мы можем взять некоторое символическое имя и присвоить ему постоянное значение.

Это можно сделать в заголовке программы следующим образом:

#define PI  3.14 

#define AUTOR "valenok2003@mail.ru"




в общем виде это выглядит так: #define идентификатор значение 

где #define - конструкция позволяющая присвоить идентификатору(имени константы) её значение. 

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

Например, мы можем решить увеличить точность и установить  

#define PI 3.14159 

В этом же примере мы присвоили идентификатору AUTOR значение valenok2003@mail.ru

Обращаю ваше внимание, что идентификатор - это произвольное имя, которое задаёт сам программист, тем не менее гораздо удобнее использовать такие символические имена, которые ассоциируются с данными им присвоенными.

И последнее, идентификаторы констант для соблюдения стиля пишутся прописными(заглавными) буквами. 
  • sansanyh это нравится



Copyright © 2024 Your Company Name