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

Theme© by Fisana
 

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

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


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

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

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

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

#16 valenok2003

valenok2003

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

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

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

Переменная.

В ходе решения тех или иных задач возникает необходимость постоянно вычислять и сохранять промежуточные данные. Мы уже знаем, что константа не удовлетворяет этим требованиям, поскольку она неизменяема по определению. Для хранения изменяемых данных служат переменные. Переменная является своеобразной упаковкой для данных, но в каждую упаковку можно положить данные определённого типа. Если это тип int, то в переменной могут храниться только целые числа.  Если тип string - текстовые строки.

Переменные можно описать в заголовке программы. Такие переменные будут доступны во всех функциях программы и каждая функция может изменить её содержимое (но не тип).  Такие переменные называют Глобальными.

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

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

Прежде чем использовать переменную, необходимо её  инициализировать, то есть присвоить ей значение.

В примере показано, как правильно описать и инициализировать переменную.


int Var = 0;
int X = 5;double Y = 7.0;
string Name = "valenok2003";
string TF = "M1";
Давайте посмотрим что произошло в примере


переменной типа int по имени Var  при помощи оператора присвоения  =  присвоено значение 0 , точка с запятой сообщает об окончании операции.

переменной типа int по имени X  при помощи оператора присвоения  =  присвоено значение 5 , точка с запятой сообщает об окончании операции.

переменной типа  double по имени Y   при помощи оператора присвоения  =  присвоено значение 7.0 , точка с запятой сообщает об окончании операции.

переменной типа  string по имени Name   при помощи оператора присвоения  =  присвоено значение  valenok2003, кавычки в описании строковой переменной показывают где строка начинается, а где заканчивается,  они обязательны. точка с запятой сообщает об окончании операции.

и, наконец, переменной типа  string по имени TF   при помощи оператора присвоения  =  присвоено значение  M1, про кавычки мы уже помним, про точку с запятой тоже.

следующая запись равносильна предыдущей:


int Var = 0, X = 5,

     Y = 7;

string Name = "valenok2003",

          TF = "M1";

 

Имена переменных для улучшения стиля лучше начинать с прописной буквы, например, Name .

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

 
 

#17 valenok2003

valenok2003

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

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

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

Оператор - это команда программы понятная компьютеру.

Операнды - это переменные или константы с которыми производится текущая операция. 

Запись Х = 5 в программировании не означает что Х равно 5, она означает что переменной X присвоено значение 5. 

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

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

#18 valenok2003

valenok2003

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

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

Отправлено 16 November 2010 - 11:45

Пишем первый индикатор.


Откройте окно редактора. 

Если у вас в редакторе открылось окно Example_1, закройте его.

В папке indicators в окне навигатора отыщите файл с именем Example_1. 

Выберите его правой кнопкой мыши и выберите пункт удалить.

Как видите, удалять ненужные файлы тоже очень просто. Однако я рекомендую не удалять старые файлы индикаторов, а сохранять их в вашем личном архиве, путём простого перемещения файла средствами windows. Файлы пользовательских индикаторов можно найти в папке C:\Program Files\MetaTrader\experts\indicators.


Создадим новый шаблон и присвоим ему имя:  Example_2 + ваши инициалы + дату создания шаблона,

в моём случае получилось:  Example_2 GS_2010_11_16, конечно, такое имя несколько тяжеловесно, однако, это позволяет вам

1. Опознать свой индикатор, если вы его встретите, не заглядывая в код.

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

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


Итак, создаём новый шаблон. Заполните первую форму по образцу.


Изображение


Во вторую форму не заносите ничего, просто нажмите кнопку Готово.



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

#19 valenok2003

valenok2003

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

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

Отправлено 16 November 2010 - 13:18

В окне редактора появился новый шаблон.

Нажмите кнопку компилировать в верхней части окна редактора.

Изображение

#20 valenok2003

valenok2003

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

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

Отправлено 16 November 2010 - 13:26

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

Изображение

это говорит о том, что компиляция нашего индикатора благополучно завершена. Результатом работы компилятора будет файл Example_2 GS_2010_11_16.ex4

Вы не увидите этот файл в дереве навигатора, однако, если заглянете в папку C:Program FilesMetaTraderexpertsindicators, то вы его легко обнаружите.

Теперь давайте переключимся из окна редактора в окно терминала. Кнопка переключения в верхней части окна редактора рядом с кнопкой компилятор и надпись на ней гласит терминал.
  • sansanyh это нравится

#21 valenok2003

valenok2003

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

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

Отправлено 16 November 2010 - 13:41

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

Изображение

давайте попробуем кинуть его на график.

Должно появиться окно

Изображение

Хочу обратить ваше внимание, что текст - Ура! Это работает! - введённый при создании шаблона, появился в окне свойств индикатора, среди входных параметров.

Нажимаем кнопку OK. Форма закроется.
Однако пока ничего не происходит, хотя мы можем убедиться в том, что индикатор присутствует на окне, посмотрев список индикаторов в свойствах окна.
  • sansanyh это нравится

#22 valenok2003

valenok2003

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

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

Отправлено 16 November 2010 - 14:01

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


//+------------------------------------------------------------------+
//|                                      Example_2 GS_2010_11_16.mq4 |
//|                                              valenok2003@mail.ru |
//|                                             http://fxgeneral.com |
//+------------------------------------------------------------------+
//параметр #property служит для передачи информации терминалу
//здесь мы сообщили кто автор и какой у него сайт

#property copyright "valenok2003@mail.ru"
#property link      "http://fxgeneral.com"

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

#property indicator_chart_window

// если бы мы хотели вывести индикатор в отдельное окно, 
// мы бы написали так: #property indicator_separate_window

//---- input parameters
//это внешний параметр, в данном случае переменная типа string с именем Text которой при помощи
//оператора присваивания присвоено значение <Ура! Это работает!>
//кавычки показывают начало и конец строки и являются обязательными
//слово extern позволяет описать эту переменную как внешнюю и она будет среди прочих
//в окне свойств индикатора

extern string    Text="Ура! Это работает!";


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

#23 valenok2003

valenok2003

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

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

Отправлено 16 November 2010 - 14:32

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

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

#property indicator_chart_window

// переменная Text доступна из всех функций программы
// поскольку описана в заголовке и является ГЛОБАЛЬНОЙ
extern string    Text="Ура! Это работает!";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//----
// мы вызываем функцию my_alert из функции start и передаём ей в качестве
// параметра нашу переменную Text, которая в настоящий момент содержит текст
// Ура! Это работает! 
   my_alert(Text); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//здесь мы создаём собственную функцию
// тип void означает, что функция не собирается возвращать никаких параметров (данных)
void my_alert(string My_Text)
{
   // функция скопировала данные из переменной Text в свою переменную My_Text
   // переменная My_Text доступна только внутри этой функции, поскольку создана
   // и описана внутри этой функции, такая переменная называется ЛОКАЛЬНОЙ
   
   Alert(My_Text); // Alert встроенная фунция, информацию по ней вы можете получить
   //клавишей F1 (смотри на стр1 этого топика)
   return; 
}

ВНИМАНИЕ в строке alert(My_Text);  слово alert должно быть с большой буквы, почему-то местный редактор кодов исправляет её на маленькую.  Перечень слов изменяемых редактором можно посмотреть здесь.

Чтобы произвести какие-то действия, функция должна получить данные, поэтому описывая функцию, мы пишем (string My_Text), что означает, что функции для её работы нужно передать строковые данные, которые самой функцией будут восприняты как строковая переменная с именем My_Text.
  • sansanyh это нравится

#24 valenok2003

valenok2003

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

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

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

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

Попробуйте изменить текст в окне свойств индикатора.

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

#25 valenok2003

valenok2003

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

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

Отправлено 08 December 2010 - 13:15

Вызов пользовательской функции.

Для того чтобы осуществить вызов функции необходимо в тело программы вставить - имя функции (параметр1, параметр2 .... параметрN). Пользовательская (то есть вами написанная) функция может быть вызвана из любой другой функции. (Из функций init(), start(), deinit() или другой пользовательской функции).

В нашем примере мы вызываем функцию my_alert(Text); с параметром Text. 

Тип и количество параметров передаваемых в функцию должны соответствовать определённым в описании функции.

Напомню, что наша функция описана следующим образом

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

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


int start()
  {
//----
// мы вызываем функцию my_alert из функции start и передаём ей в качестве
// параметра нашу переменную Text, которая в настоящий момент содержит текст
 
   my_alert("можно и так"); 

   string Text_1= "или так";

  my_alert(Text_1); 
//----
   return(0);
  }

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

#26 valenok2003

valenok2003

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

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

Отправлено 08 December 2010 - 16:23

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

Это наиболее часто употр*цензура*емый оператор. 


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

В нашем примере мы присвоили текст Ура! Это работает! Строковой переменной Text

extern string    Text="Ура! Это работает!";

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

Например:

start()
{
     int    X =7+5; //переменной X присвоено значение 12.

      //так тоже правильно


      int Z = X; //переменной Z присвоено значение X, теперь и Z и X равны 12

     //  то-есть значение X не изменилось
}

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

#27 valenok2003

valenok2003

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

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

Отправлено 08 December 2010 - 17:16

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

Все операторы важны, однако оператор if - else стоит на особом месте, поскольку позволяет производить те или иные действия в зависимости от определённых условий.
Сочетание if - else можно перевести так: если - в противном случае.
Записывается так:


   if(условие)
   {
         какие-то действия;
   }
   else другие действия;


ВАЖНО!

Допускается использование оператора if-else с отсутствующей частью else.
То-есть вы можете написать 


   if(условие)
   {
         какие-то действия;
   }
 

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

     if(условие) какое-то действия;

 

Давайте попробуем использовать оператор на практике.Создайте новую программу, только при создании шаблона выберите - пользовательский скрипт. Назовите программу Example_3.
  • Leonix и sansanyh это нравится

#28 valenok2003

valenok2003

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

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

Отправлено 08 December 2010 - 17:49

Введите следующий код:


//+------------------------------------------------------------------+
//|                                      Example_3 GS_2010_12_08.mq4 |
//|                                              valenok2003@mail.ru |
//|                                             http://fxgeneral.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property show_inputs //выводить окно со свойствами перед запуском скрипта

extern bool Hi = true;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
//----
   if(Hi)
   {
      Alert("Всем привет!");
   }
   else Alert("До свидания!");
//----
   return(0);
}
//+------------------------------------------------------------------+

Не забудьте исправить в слове alert первую букву на заглавную A.
  • Leonix и sansanyh это нравится

#29 valenok2003

valenok2003

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

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

Отправлено 08 December 2010 - 18:03

В качестве внешней переменной мы использовали булеву переменную Hi. Она может принимать только 2 значения true и false. Попробуйте ещё раз запустить скрипт, заменив в настройках значение true на false и посмотрите, что получится. 

Как видите, при разных настройках в алерте выводятся разные строки.

Выражение
if(Hi)  Alert("Всем привет!");
интерпретируем так: если то, что заключено в скобки - истина, выполняем команду
Alert("Всем привет!");
в противном случае выполняем команду
alert("До свидания!");
А поскольку переменная Hi может принимать только два значения - истина или ложь, то запись является корректной.

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

#30 valenok2003

valenok2003

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

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

Отправлено 08 December 2010 - 18:08

Для дальнейшей работы нам необходимо рассмотреть 

Операции отношения
К символам операций отношения относятся следующие:

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

и 

Логические операции
К символам логических операций относятся следующие:

!          НЕ (логическое отрицание)   - меняет (переворачивает) значение ложь и истина
||        ИЛИ    (логическое ИЛИ)  - если хотя бы одно из выражений истина, то возвращается истина
&&      И (логическое И)              - истина, если все выражения истины

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



Copyright © 2024 Your Company Name