Перейти к содержанию
Форекс Форум трейдеров Академии «MasterForex-V»

Liv

Пользователи ST test (off)
  • Постов

    147
  • Зарегистрирован

  • Посещение

Весь контент Liv

  1. Хочу представить вам простой скрипт, который расставляет линии поддержки, точки разворота, линии сопротивления согласно тем данным, которые вы введёте. Этот скрипт я написал ещё в самом начале своего прихода на Форекс, но до сих пор периодически использую. Он очень простой и вы сами прекрасно в нём разберётесь. MQL#property copyright "Игорь Лопатин, 2006" // указывает, что нужно обязательно выводить окно со свойствами #property show_inputs // опеределяем значения для линий // если равно нулю - линия выводиться не будет extern double СопротивлениеВерхнее = 0; extern double СопротивлениеНижнее = 0; extern double ТочкаРазворота = 0; extern double ПоддержкаВерхняя = 0; extern double ПоддержкаНижняя = 0; // определяем цвета для линий extern color цвСопр1 = Red; extern color цвСопр2 = Chocolate; extern color цвРазв = White; extern color цвПодд1 = DarkTurquoise; extern color цвПодд2 = Lime; // собственно здесь всё делается int start() { // можно изменить стиль линии на желаемый - смотрите в хелпе int СтильЛинии = STYLE_DOT; // удалим всё старое, если есть if (ObjectFind("Сопр1" )!=-1) ObjectDelete("Сопр1" ); if (ObjectFind("Сопр2" )!=-1) ObjectDelete("Сопр2" ); if (ObjectFind("Разв" ) !=-1) ObjectDelete("Разв" ); if (ObjectFind("Подд1" )!=-1) ObjectDelete("Подд1" ); if (ObjectFind("Подд2" )!=-1) ObjectDelete("Подд2" ); if (СопротивлениеВерхнее>0) { // если есть верхнее сопротивление ObjectCreate("Сопр1" ,OBJ_HLINE,0,0,СопротивлениеВерхнее); ObjectSet("Сопр1" ,OBJPROP_COLOR,цвСопр1); ObjectSet("Сопр1" ,OBJPROP_STYLE,СтильЛинии); } if (СопротивлениеНижнее>0) { // если есть нижнее сопротивление ObjectCreate("Сопр2" ,OBJ_HLINE,0,0,СопротивлениеНижнее); ObjectSet("Сопр2" ,OBJPROP_COLOR,цвСопр2); ObjectSet("Сопр2" ,OBJPROP_STYLE,СтильЛинии); } if (ТочкаРазворота>0) { // если есть точка разворота - пивот (Pivot) ObjectCreate("Разв" ,OBJ_HLINE,0,0,ТочкаРазворота); ObjectSet("Разв" ,OBJPROP_COLOR,цвРазв); ObjectSet("Разв" ,OBJPROP_STYLE,СтильЛинии); } if (ПоддержкаВерхняя>0) { // если есть верхняя поддержка ObjectCreate("Подд1" ,OBJ_HLINE,0,0,ПоддержкаВерхняя); ObjectSet("Подд1" ,OBJPROP_COLOR,цвПодд1); ObjectSet("Подд1" ,OBJPROP_STYLE,СтильЛинии); } if (ПоддержкаНижняя>0) { // если есть нижняя поддержка ObjectCreate("Подд2" ,OBJ_HLINE,0,0,ПоддержкаНижняя); ObjectSet("Подд2" ,OBJPROP_COLOR,цвПодд2); ObjectSet("Подд2" ,OBJPROP_STYLE,СтильЛинии); } return(0); } Если запустить скрипт и не ввести данных, то просто будут удалены старые линии, которые были созданы этим скриптом.
  2. Назначение скриптов достаточно простое: один раз исполниться и замолкнуть! Сделать какие-нибудь одноразовые расчёты, начертить что-нибудь, прочитать историю и записать в файл, сделать что-нибудь полезное, например, открыть ордер.... Кстати, с помощью скрипта ордер открывается несколько быстрее, чем вручную и это может помочь при "писовке". В эту ветку мы будем записывать наши скрипты.
  3. Здесь будут собираться все хитрости и трюки этого простого языка. Приглашаю всех делиться своими знаниями.
  4. Задним числом все умны.... (с) не мой...
  5. После того, как мы определили цикл, начинаем делать расчёты внутри цикла. Расчёт мувинга (скользящего среднего) будет делаться с помощью встроенной функции iMA. Не обязательно запоминать полностью написание всех параметров функций, - достаточно запомнить только написание имени функции. Уже при написании имени функции редактор предложит вам список, из которого вы сможете выбрать нужное слово. Пишем её, выделяем и нажимаем F1. Откроется окно подсказки, где вы увидите полностью расписанную функцию со всеми параметрами. http://forex.orotukan.ru/images/new05.jpg У редактора очень хороший хелп (помощь, справка) и вы всегда сможете быстро найти нужный раздел, стоит только выделить ключевое слово и нажать клавишу F1. И даже если вы не помните написание той или иной функции, то и тут есть удобный выход: нужно запомнить как пишется всего одна функция из каждой группы, после чего достаточно будет написать её, выделить и нажать клавишу F1. Откроется описание самой функции, а слева (выделено красным) будет список всех функций в группе. Чтобы мне больше не возвращаться к теме хелпа по языку MQL, предлагаю вам самостоятельно покопаться в этом замечательном справочнике. Ну, а мы вернёмся к нашим расчётам: MQLExtMapBuffer1=iMA(NULL,0,ПервыйПериод,0,MODE_SMA,PRICE_CLOSE,i); где параметры: NULL - обозначает, что мы не будем конкретизировать инструмент, по которому считается эта средняя, а будет использован тот, который установлен на графике. Первое время я прописывал здесь используемый инструмент. А однажды никак не мог понять почему линия показвает полную билиберду! Только после я понял, что на график с фунто-йеной воткнул расчёт евро-бакса! После чего, на подобных расчётах у меня всегда свободный выбор. 0 - мы не конкретизируем таймфрэйм. ПервыйПериод - внешний параметр, определённый у нас в начале модуля 0 - обойдёмся без сдвига. MODE_SMA - встроенная константа выбора метода усреднения, хорошо описаная в хелпе. В данном случае мы применяем "простое скользящее среднее". PRICE_CLOSE - встроенная константа выбора используемой цены. Здесь мы указываем, что будет цена закрытия. i - наша переменная цикла, указывающая текущий бар. Точно так же делаем расчёт остальных линий. MQLExtMapBuffer1=iMA(NULL,0,ПервыйПериод,0,MODE_SMA,PRICE_CLOSE,i);ExtMapBuffer2=iMA(NULL,0,ВторойПериод,0,MODE_SMA,PRICE_CLOSE,i); ExtMapBuffer3=iMA(NULL,0,ТретийПериод,0,MODE_SMA,PRICE_CLOSE,i); ExtMapBuffer4=iMA(NULL,0,ЧетвертыйПериод,0,MODE_SMA,PRICE_CLOSE,i); Как вы уже наверное поняли, массивы ExtMapBuffer1-4 - это и есть собственно линии. Сами массивы были связаны с вычерчиванием линий в функции начальной загрузки init() с помощью функции SetIndexBuffer. Предоставляю вам самим разобраться с назначением и использованием этой функции. Вот и всё! Наш индикатор готов. Остаётся только сохраниться (меню "Файл" -> "Сохранить Ctrl+S") и нажать кнопку "Компилировать". Если в синтаксисе вашего модуля всё впорядке, то ошибок компиляции не будет и должны появиться две строчки: Компиляция "Индикатор Сидуса.mq4"... 0 ошибок, 0 предупреждений После этого можно кидать ваш индикатор на график и наслаждаться сразу четырьмя линиями "одним движением"
  6. Теперь, когда всё готово мы займёмся кодингом - собственно написанием исходного кода программы. Сразу же некоторые правила написания программ на языке MQL. в программе нет переносов строк и операционная строка должна заканчиваться точкой с запятой (;) Вот два фрагмента программы, вот: MQLif (a==ДвижениеВверх) Событие=МожноПокупать; и вот: MQLif ( a == ДвижениеВверх ) Событие=МожноПокупать; Казалось бы имеется огромная видимая разница! Но, на самом деле никакой разницы в этих двух фрагментах нет, они совершенно идентичны и будут одинаково работать. В первом варианте всё написано одной строкой и заканчивается кроме точки с запятой ещё и переносом строки. Во втором варианте имеется куча переносов строк... но, как я говорил ранее, перенос строк в программе MQL не имеет значения (за некотороми исключениями) и здесь операционную строку закрывает точка с запятой, что мы и видим во втором варианте. исходя из первого, желательно делать отступы так, чтобы было удобно читать программу. Вот два вида расстановки операционных скобок: MQL/* так я привык расставлять скобки */ if (Событие==МожноПокупать) { OpenOrder(); } /* так предлагает редактор */ if (Событие==МожноПокупать) { OpenOrder(); } Оба вида совершенно идентичны в работе, но я давно пишу и привык именно к такой расстановке скобок, а вы может будете использовать другой... или сами свой придумаете! Главное, не лепить всё в кучу, а писать так, чтобы и через года можно было без труда прочитать вашу программу. обязательно коментируйте свои программы, чтобы и через года вы легко в них разобрались. Есть два вида коментариев: строчный начинается с двух наклонных // и до конца строки - здесь действует перенос строки многострочный начинается с комбинации наклонная+звёздочка /* и до следующей комбинации звёздочка+наклонная */ [*]операционные скобки не требуют точки с запятой Как я ранее говорил, фигурные скобки являются операционными скобками и всё, что находится внутри них - есть единый блок выполнения. Примеры: MQL/* здесь открывается операционная скобка ЕСЛИ и до тех пор, пока она не будет закрыта будут выполняться инструкции, заключённые внутри скобок */ if (a==ДвижениеВверх) { Событие=МожноПокупать; for (int i=0; i<=10; i++) { Проба(); } // здесь не обязательно ставить точку с запятой } // здесь тоже не обязательно, хотя ошибки не будет /* и только после закрытия сработает слудующая операция */ Событие=МожноПродавать; /* здесь операционными скобками ограничена функция */ void Проба() { Событие=0; } // здесь тоже нет.... /* всё, что будет далее никак не войдёт в саму функцию */ [*]для нормального чтения программы желательно делать отступы. Редактор сам автоматически делает отступ по предыдущему, чем упрощается написание кода. Можно пользоваться пробелами или символами табуляции, нажимая клавишу TAB. В настройках редакторая есть установка как делать эти отступы при нажатии клавиши TAB (символы табуляции или пробела, количество символов отступа). Остальное вы быстро освоите в процессе написания программ. Для учёбы и создана эта ветка.... присоединяйтесь к работе. Ну, а мы сначала сделаем инидикатор под стандартный "Сидус".... тем более что переделать под новую модификацию после этого нам не составит труда. Верно?
  7. Во-первых, для обучения, во-вторых, приходится четыре раза кидать на график мувинги.... и наконец, будет продолжение в том, что будем указывать моменты входа и выхода.... развивать... и, может быть, получится МТС... :)
  8. Те, кто хочет научиться делать нужные индикаторы сам, приглашаю на форум "Язык MQL для трейдеров". Там начинается курс для всех о том как создать индикатор самому.
  9. В этой ветке мы будем создавать индикаторы... разные... нужные! Для начала я предлагаю создать индикаторы для ТС Сидуса. Имеется приличная ветка форума ("Система Сидуса"), посвящённая этой системе, вот ей в помощь мы и начнём работать. Для создания индикатора нужно сначала немного продумать нашу стратегию. В ТС Сидуса используются четыре мувинга - значит будет 4 линии, затем для каждой линии нужно определить период и цвет. Итак, у нас будут четыре внешних (extern) переменных и четыре цвета линий. Открыть редактор вы сможете теми же способами, которые были описаны в "Создание библиотек". Таким же способом, как там указано, вы создадите новый индикатор, только в приглашающем окне нужно будет: выбрать опцию "Пользовательский индикатор" указать наименование индикатора, например, "Индикатор Сидуса" определить все переменные Для этого на следующей странице окна нужно определить их: http://forex.orotukan.ru/images/new03.jpg Как вы видите, я определил четыре внешних переменных (или 4 входных параметра индикатора) со значениями по умолчанию 5, 12, 18, 28. В готовом индикаторе эти параметры каждый пользователь сможет менять соглано его собственной стратегии. определить количество и цвет линий Переходим "Далее" и определяем количество и цвет линий индикатора: http://forex.orotukan.ru/images/new04.jpg Обратите внимание, что бы не стояла галочка у "Индикатор в отдельном окне" (обведено красным), т.к. сам индикатор должен накладываться на график цен. После нажатия кнопки "Готово" редактор создаст файл индикатора и откроет его для редактирования. Вы можете видеть, что основа модуля уже создана: имеются определения линий препроцессора (т.е. то, что будет обработано ещё перед компилляцией), имеются объявления и назначения внешних параметров и объявление массивов-линий, имеется функции init() и start(). Нам остаётся только сделать расчёт значений линий и назначений этих данных в массивы-линии. Расчёты делаются для каждого бара, присутствуюшего на графике. Для чего в цикле мы будем проходить все бары. В виду того, что в MQL отсутствуют условные циклы, мы будем пользоваться безусловным циклом for(): MQLfor(int i=Bars-1; i>=0; i--) { // вычисления } Эта конструкция обозначает следующее: "для целой переменной i равной числу баров на графике делать вычисления пока i будет больше или равна нулю с уменьшением i на единицу". Фигурные скобки называются операторными скобками и указывают, что всё, что заключено в них будет обрабатываться в этом цикле. Если бы там была одна единственная формула для расчёта, то операторные скобки были бы не нужны. А теперь маленькое отступление. Если с приходом каждого тика будут проходиться в цикле все бары графика, то это может создать "неплохие" тормоза в работе терминала. Для одного графика это ещё не очень заметно, но для нескольких графиках на разных валютных парах терминал начинает серьёзно тормозить! К счастью, разработчики MQL об этом подумали. Имеется встроенная функция IndicatorCounted(), которая будет выдавать только то количество баров, которые неизменились после последнего тика. Получается, что при каждом тике надо будет пересчитать и перерисовать только 1 бар - последний. Кстати, мастер создания модуля сразу подготовил именно эту функцию и вы можете её увидеть в функции start(). Теперь наш цикл будет выглядеть так: MQLint start() { int counted_bars=IndicatorCounted(); for(int i=counted_bars;i>=0;i--){ /* вычисления */ } return(0); }
  10. Приглашаю всех зайти на форум "Язык MQL для трейдера", где в данный момент начинается ветка по созданию индикатора для ТС Сидуса и принять в этом своё участие.
  11. Хм... насколько я понял вы, Yuraz уже давно работаете с программированием в Форексе! Поэтому мне был странен такой вопрос.... вернее сама постановка вопроса.... Тем не менее я приглашаю всех поработать совместно над данным вопросом на форуме "Язык MQL для трейдеров". Те, кто ещё не умеет программировать в MQL смогут обучиться там, ибо сам язык очень прост и имеются великолепные возможности редактора MetaEditor.
  12. И так, начинаем..... Все константы будут сгруппированы по назначению. MQL/* движение */#define ДвижениеФлэт 0 #define ДвижениеВверх 1 #define ДвижениеВниз 2 #define ВершинаНаверху 3 #define ВершинаВнизу 4 #define ДостигнутМаксимум 5 #define ДостигнутМинимум 6 #define Перекрестие 7 /* события */ #define СобытийНет 0 #define ВозможнаПокупка 1 #define Покупка 2 #define ВозможнаПродажа 3 #define Продажа 4 Предлагайте свои константы для дополнения.
  13. Для начала давайте сравним два кусочка кода. Первый: MQLif (a==1) Event=1;if (a==2) Event=3; if (Event==1) OpOrder(); if (Event==3) ClOrder(); Правда, не очень понятно... Конечно, когда писалось, то было всё понятно, но по прошествии даже двух дней можно потерять нить... А теперь второй: MQL#define ДвижениеВверх 1#define ДвижениеВнииз 2 #define МожноПокупать 1 #define НужноЗакрывать 3 if (a==ДвижениеВверх) Событие=МожноПокупать; if (a==ДвижениеВниз) Событие=НужноЗакрывать; if (Событие==МожноПокупать) OpOrder(); if (Событие==НужноЗакрывать) ClOrder(); Вот теперь будет всё понятно даже через 10 лет и совершенно неважно какие цифры кроются в используемых константах, лишь бы они различались внутри групп использования. А для того, что бы постоянно не переписывать одни и те же константы при создании скриптов/индикаторов/советников, нужно выделить их в один заголовочный файл и после вставлять его во все свои произведения. Для информации, количество записаных констант в заголовочном файле никак не влияют на размер скомпиллированного файла, на скорость компилляции и исполнения. Т.е. в заголовочный файл можно писать своих констант сколько угодно, на все случаи жизни и работы :) . Значит будем создавать заголовочный файл. Они имеют расширение .MQH. Создание заголовочного файла происходит по тому же сценарию, что и файл библиотеки (см. Создание библиотек), только в окне выбирается пункт "Заголовочный файл (*.MQH)". Сам файл компилляции не требует, ибо вставляется текстом в модуль перед компилляцией, где все константы заменяются соответствующими цифрами. Вставляется готовый заголовочный файл в модуль очень просто: MQL/* в начале модуля добавляем такую строку */#include <мои_константы.mqh> /* или такую */ #include "мои_константы.mqh" Как я уже говорил в топике "Основы языка MQL", если имя файла заключено в угловые скобки, то файл будет искаться в каталоге experts\include, а если имя файла заключено в кавычки, то такой файл должен лежать вместе с тем модулем, куда он вставляется.
  14. Одна из функций, которая периодически используется, это функция предствления таймфрэйма в красивый строковый вид. Сам MQL использует для этого целые числа, маскируя их в константах такого вида: PERIOD_M1. Итак, заносим в нашу библиотеку первую функцию: MQL//////////////////////////////////////////////////////////////////////// функция выдаёт строчку символов в виде текущего периода int ПоказатьПериод(int ТекущийПериод) { string ret; // это будем возвращать после назначения // смотрим - какой период и назначаем соответствующую строчку switch(ТекущийПериод) { case PERIOD_M1: ret="M1" ; break: case PERIOD_M5: ret="M5" ; break: case PERIOD_M15: ret="M15" ; break: case PERIOD_M30: ret="M30" ; break: case PERIOD_H1: ret="H1" ; break: case PERIOD_H4: ret="H4" ; break: case PERIOD_D1: ret="D1" ; break: case PERIOD_W1: ret="W1" ; break: case PERIOD_MN1: ret="MN1" ; break: } return(ret); } Внимание! Инструкция switch использует только целые константы. Соответствено, PERIOD_M1 и т.д. - это встроенные целые константы, обозначающие период таймфрэйма. После проверки соответствия, переменной ret назначается строка, обозначающая наше представление периода, а не целое число минут. После чего проверка прерывается (break) и с помощью инструкции return(ret) функция возвращает строчку. Внимание! У библиотечных функций не должно быть параметров по-умолчанию. Для использования функцию нужно объявить в вашем модуле: MQL#import "моя_библиотека.ex4" int ПоказатьПериод(int ТекущийПериод); #import Теперь в вашем модуле эта функция может свободно использоваться: MQLstring ТекущийПериод = ПоказатьПериод(Period()); Для большей информации по используемым функциям, инструкциям, константам выделите текст и нажмите клавишу F1.
  15. Любая библиотека, как скомпиллированная библиотека .EX4, так и системные библиотеки Windows .DLL включаются в модуль очень просто: MQL/* сначала мы определяем саму библиотеку */#import "kernel32.dll" /* в каждой библиотеке определяем функции, которые мы будем использовать */ bool Beep(double* dwFreq, double* dwDuration); #import "User32.lib" int* CallWindowProc(int* lpPrevWndFunc, double* hWnd, string* Msg, int* wParam, int* lParam); #import "моя_библиотека.ex4" int MyCalculator(int value,int value2); /* наконец - закрываем объявление */ #import Файлы библиотек будут искаться в такой последовательности: experts\libraries experts системные каталоги Не желательно использовать полный путь доступа к указаной библиотеке, т.к. файл может переместиться в другое место и тогда придётся перекомпиллировать модуль. Для большей информации по импорту библиотек, нужно выделить слово import и нажать клавишу F1.
  16. Для того, чтобы не делать одного и того же по нескольку раз нужно сделать один раз и разместить в библиотеку. После этого, включая ссылку на библиотеку, пользоваться во всех своих скриптах, индикаторах и советниках. И так, начнём. Загрузить MetaEditor можно четырьмя способами: нажать кнопку http://forex.orotukan.ru/images/btn01.jpg в вашем терминале правой кнопкой мышки щёлкнуть на каком-либо пользовательском советнике, индикаторе или скрипте в окне "Навигатор", вызвать контекстное меню и там выбрать "Изменить" найти на диске программу MetaEditor.exe, которая должна находиться в корневом каталоге вашего терминала (обычно здесь: C:\Program Files\MetaQuote\ - или у вас последняя часть будет по другому) и запустить её в системном меню "Пуск" найти ссылки на ваш терминал и там запустить MetaEditor MetaEditor я буду называть в дальнейшем Редактор, так будет удобнее. В Редакторе, в главном меню "Файл" -> "Создать", или нажать самую левую кнопку (с плюсом) под меню, или нажать на клавиатуре Ctrl+N. Откроется окно "Мастер создания советника". Мы пока вибираем "Библиотека функций" -> "Далее" http://forex.orotukan.ru/images/new01.jpg Затем нужно ввести имя вашей библиотеки в поле "Имя:", например так: моя_библиотека и нажать кнопку "Готово". Если вы введёте, здесь же, все свои данные (для копирайта :) ), то они запомнятся и будут везде проставляться автоматически. Итак, заготовка для нашей библиотеки готова. Мы будем её периодически пополнять, по мере нашего обучения. Внимание Для того, чтобы исходный код был с расцвеченным синтаксисом нужно его поместить между двумя инструкциями: [MQL] ... [/MQL] точно так же, как квотирование.
  17. 4. Объявления функций MQL является процедурным языком. Это означает, что можно часть кода записать в определённую процедуру, отработать её и пользоваться ей всегда. Только самих процедур (в понимании других языков программирования) здесь нет. Здесь используются функции. Функции можно разделить на несколько категорий: общие функции преобразования типов даты и времени информация о счёте обработка массивов проверка состояния файловые математические строковые графические пользовательские индикаторы технические индикаторы доступ к таймсериям торговые функции операции с графиками пользовательские функции специальные функции init(), deinit(), start() Функций достаточно много и я их здесь перечислять не буду. Позднее я объясню как быстро работать со всеми видами функций. При создании пользовательской функции, вам необходимо помнить следующее: положение об имени функции такое же самое как и у имени переменной (см. выше) функция должная иметь тип так же, как и переменная. если функция ничего не должна возвращать (аналог процедуры), то ей присваивается тип void все переменные объявленные внутри функции будут локальными и будут видны только внутри этой функции. все параметры, обявленные при объявлении функции и переданные ей - будут локальными и, соответственно, будут видны только внутри этой функции за исключением передачи параметра по ссылке (об этом позднее). не назначенные параметры передавать в функцию обязательно (позднее мы поговорим об этом). Пример: MQLbool ПроверкаНаличия(int Что_то=0) { bool ret=false; if (Что_то==1) ret=true; return(ret); } Здесь объявлена пользовательская функция логического типа (bool) ПроверкаНаличия. В качестве параметра в неё передается целое значение (int), но необязательно, ибо при объявлении параметра происходит назначение по-умолчанию, т.е. если в функцию передали значение, например так: MQLbool Вопрос = ПроверкаНаличия(1); то это значение присваивается переменной Что_то. Если ничего не передаётся: MQLbool Вопрос = ПроверкаНаличия(); то переменной Что_то присваивается значение по-умолчанию - 0. Из всех категорий функций, перечисленных мной выше, функция start() является обязательной во всех модулях, кроме библиотек. Созданием библиотек мы займёмся на практических занятиях позднее. При загрузке (первого обращения) скомпиллированного модуля в память и работу происходит следующее: происходит выделение памяти под объявленные переменные присваивание переменным значений, в т.ч. и посредством заголовочного окна, где вам предлагается изменить значания определение всех функций выполнение функции init() выполнение функции start() При запуске скрипта эта последовательность срабатывает один раз и после исполняется функция deinit(), если она есть. При запуске индикатора или советника, после инициализации модуль ждёт следующего тика и при каждом тике выполняется функция start(). После завершения работы (удаление индикатора или советник) выполняется функция deinit(). Функции init() и deinit() являются не обязательными. Например, для скрипта они вообще не нужны и там всё будет исполняться в функции start(). Библиотека служит просто хранилищем объявлений констант, переменных и функций и сама никакой работы не выполняет. Я описал это для того, чтобы вы представляли себе структуру модуля и очёдность исполнения. На этом краткий теоретический курс мы закончим и приступим к практическим занятиям.
  18. Предопределенные переменные Наконец, есть переменные, которые называются предопределённые. Они глобальные и обращение к ним возможно в любой части модуля. Вот они: Ask Текущая цена продажи, ask - по-английски - спрашивать, просить... соответственно здесь - это цена спроса. Bars Количество баров на текущем графике. Зависит от закаченой истории. Bid Текущая цена покупки. Bid - по-английски - приказывать, предлагать цену - это цена предложения. Close Это массив, в котором проиндексированы по барам цены закрытия каждого бара текущего графика. Индекс начинается с 0 и заканчивается числом баров текущего графика (Bars-1), т.е. цена закрытия текущего бара будет Close[0]. Digits Количество цифр после запятой в ценах. Зависит от используемого инструмента, т.е. если на EURUSD Digits будет равна 4, то на USDJPY - 2. High Это массив, в котором проиндексированы по барам максимальные цены каждого бара текущего графика. Индекс начинается с 0 и заканчивается числом баров текущего графика (Bars-1), т.е. максимальная цена текущего бара будет High[0]. Low Это массив, в котором проиндексированы по барам минимальные цены каждого бара текущего графика. Индекс начинается с 0 и заканчивается числом баров текущего графика (Bars-1), т.е. минимальная цена текущего бара будет Low[0]. Open Это массив, в котором проиндексированы по барам цены открытия каждого бара текущего графика. Индекс начинается с 0 и заканчивается числом баров текущего графика (Bars-1), т.е. цена открытия текущего бара будет Open[0]. Point Размер одного пункта ("pip") в текущем инструменте. Time Массив, содержащий время открытия каждого бара текущего графика. Данные представляют собой тип datetime и напрямую использовать не очень-то и понятно. Но имеется достаточно много функций преобразования этого числа в удобочитаемую форму. Volume Массив, содержащий количество тиков каждого бара текущего графика. Все эти переменные связаны с текущим графиком (инструмент, таймфрэйм). Они обновляются с каждым тиком автоматически. Но бывает, когда индикатор или советник не успевают обработать последний тик. Тогда можно принудительно сделать обновление этих переменных с помощью функции RefreshRates(). Об этом мы ещё поговорим, когда будем работать с непосредственными решениями.
  19. Массивы Массивы - это проиндексированная совокупность однотипных данных. К примеру, у нас есть данные по цене (свеча): High = 1.3447 Open = 1.3431 Close = 1.3437 Low = 1.3430 Эти данные можно занести в массив: MQLdouble ОднаСвеча[]={1.3447,1.3431,1.3437,1.3430}; В итоге все данные сгруппированы в одном одномерном массиве, где High будет находиться под индексом 1, Open - 2, Close - 3, Low - 4. Можно все часовые свечи за прошедшие сутки записать в одном массиве, тогда мы получим двухмерный массив, где первым индексом будет номер свечи по-порядку, а вторым - цена: MQLdouble Свечи[24][4]; // объявляем массив 24х4for(int i=24;i>0;i--){ for(int j=1;j<=4;j++){ if (j==1) Свечи[j]=iHigh(NULL,PERIOD_H1,i); else if (j==2) Свечи[j]=iOpen(NULL,PERIOD_H1,i); else if (j==3) Свечи[j]=iClose(NULL,PERIOD_H1,i); else if (j==4) Свечи[j]=iLow(NULL,PERIOD_H1,i); } } После этого, получить цену открытия, например, в 12 часов можно очень легко: MQLdouble ЦенаОткрытия12 = Свечи[12][2]; Но главное использование массивов в языке MQL - это индикаторы. Вывод графика на экран проводится с помощью связанного массива. Но об этом см. ниже.
  20. Переменные (продолжение) Область видимости Все переменные имеют область видимости. Этот термин означает, что переменная где-то видна, а где-то может быть не видна. К сожалению, в языке MQL нет специальных инструкций для определения области видимости переменных (глобальная, локальная, частная и пр.). Но тут всё просто! Если переменная объявлена вначале модуля (вне всяких функций), то она глобальная и видна в любой части модуля. Если переменная объявлена внутри функции, то она будет видна только внутри этой функции и внутри всех вложенных функций. Примеры: MQL/* Здесь объявлена переменная Proba. Она является глобальной, т.к. объявлена в начале модуля, вне функций и внешней, т.е. редактируемой пользователем. */ extern int Proba=1; /* назначаем глобальную переменную Proba1 она объявлена в начале модуля и будет видна во всех функциях */ int Proba1=2; /* В этой функции тоже объявим локальную переменную Proba1 ошибки никакой не будет, но компиллятор предупредит, что произошло повторное объявление переменной Proba1, т.к. была объявлена глобальная переменная Proba1 И тут же объявлена локальная переменная Proba2. */ void test1() { int Proba1=4; int Proba2=0; Print("Proba1=" ,Proba1); // выведется "Proba1=4" Print("Proba2=" ,Proba2); // выведется "Proba2=0" } /* А в этой функции просто выводятся значения переменных. Proba1 выведется нормально, но при выводе переменной Proba2 произойдёт ошибка */ void test2() { Print("Proba1=" ,Proba1); // выведется "Proba1=2" Print("Proba2=" ,Proba2); // будет ошибка! Переменная Proba2 не будет найдена! } Есть очень интересная инструкция static. Она предназначена для локальных переменных (для глобальных - не имеет никакого значения). При указании переменной как static, её значение сохраняется до следующего вызова функции. Пример: MQLint test() { static int proba; proba = proba+1; return(proba); } int start() { int proba1=0; for(int i=0;i<=10;i++){ proba1=test(); Print(proba1,"," ); } return(0); } В результате выполения этого скрипта будет выведен через запятую ряд цифр от 1 до 10. Все параметры, которые опеределяются для функций будут локальными, за исключением передачи переменных по ссылке, но об этом будет далее. И, наконец, есть ряд переменных, о которых стоит сказать особо: массивы.
  21. Это делается с помощью программирования... Сейчас можно научиться программированию в MQL прямо здесь, на форуме, зайдя сюда http://forum.masterforex-v.org/index.php?showtopic=5558 Там начат курс языка MQL4 для трейдеров.
  22. 3. Объявления переменных Каждая переменная, перед использованием должная быть объявлена и назначена. В MQL эти два процесса можно объеденить в одну операцию. Например: MQLint igTFrame = Period(); Здесь объявляется целая (int) переменная igTFrame, которая будет содержать в себе текущий таймфрэйм. Указание типа перед переменной обязательно, потому, что в данном случае идёт виделение памяти для этой переменной. Существует несколько типов: int - целые числа... это числа без дробей в промежутке от -2147483648 до +2147483647. double - числа двойной точности с плавающей точкой. В общем-то, значение этого числа трудно даже представить.... что-то там в степени 308!... а точность обеспечивается 15 значащами цифрами. Хватит на многое. bool - логические значения true и false; ну, с этим, думаю всё понятно - всего два значения - истина и ложь. string - символьные строки; color - целое число, представляющее RGB-цвет; достаточно простое значение переменной, представить можно в нескольких типах:литералы; тем, кто привык работать с палитрами, это представление цвета будет наиболее удобным: C'128,128,128' // серый C'0x00,0x00,0xFF' // синий названия цветов - этим пользоваться проще всего: Red // красный Yellow // желтый Black // черный целочисленные представления 0xFFFFFF // белый 16777215 // белый 0x008000 // зеленый 32768 // зеленый [*]datetime - дата и время, беззнаковое целое число, содержащее количество секунд, прошедших с 0 часов 1 января 1970 года. Для представления в удобочитаемый вид существует множество функций, которые мы будем использовать в своих занятиях. Имена переменных составляются из букв, цифр и знака подчёркивания "_", не должны начинаться на цифру. В руководствах указывается, что переменные должны нести буквы латинского алфавита, но после многочисленных проверок, я удостоверился, что можно называть по-русски и переменные, и константы, и пользовательские функции. Длина переменной (константы, функции) не должная превышать 31 символ. Регистр различается, т.е. МояПеременная и мояПеременная - это разные переменные! Имеется ряд зарезервированных слов, кот. нельзя использовать в качестве переменной (константы, функции). Здесь я их перечислять не буду, их не много. При попытке использовать это слово в другом качестве появится ошибка при компилляции модуля.
  23. Там есть великолепная отмазка: систему должен настраивать сам пользователь!! :)
  24. #property - специальные параметры скрипта/индикатора/советника Специальные параметры используются для: выделения памяти и определения линий настройки отображения индикаторов определения общего вида вывода Рассмотрим подробно каждый из параметров: link Cсылка на сайт производителя. Значение - строчная константа. copyright Название компании-производителя. Значение - строчная константа. stacksize Размер стека для рекурсивных вызовов. Если рекурсии в ваших модулях нет, то этот параметр можно не указывать. Значение - целое число, указывающее количество рекурсивных вызовов ваших функций. library Этот параметр указывает на то, что данный модуль является библиотекой. Стартовая функция игнорируется, линковщик не удаляет функции, которые не вызываются из других функций. После компилляции этот модуль можно использовать как файл, импортируемый параметром #import. indicator_chart_window Указывает, что нужно выводить индикатор в окно графика. indicator_separate_window Указывает, что нужно выводить индикатор в отдельное окно. indicator_buffers Определяет количество буферов (массивов) для расчета индикатора. Целое число от 1 до 9. indicator_minimum При определении отдельного окна, указывает на нижнее, минимальное ограничение шкалы окна индикатора. Тип числа double. Значение может быть как отрицательным, так и положительным. indicator_maximum При определении отдельного окна, указывает на верхнее, максимальное ограничение шкалы окна индикатора. indicator_colorN Определяет цвет для вывода линии индикатора. N - целое число от 1 до 9 указывает на конкретную линию индикатора. Значение типа color (см. описание ниже). indicator_widthN Определяет толщину линии индикатора N, где N от 1 до 8. Значение - целое число указывающее на количество пикселей в линии indicator_styleN Определяет стиль линии индикатора N, где N от 1 до 8. Значение - целое число, уазывающее тип линии. В MQL определены константы, которыми просто пользоваться: STYLE_SOLID - сплошная линия STYLE_DASH - штриховая линия STYLE_DOT - пунктирная линия STYLE_DASHDOT - штрих-пунктирная линия STYLE_DASHDOTDOT - штрих-пунктирная линия с двойными точками indicator_levelN Определяет наличие горизонтальный линии-уровня N в отдельном окне индикатора, где N от 1 до 8. Удобно для визуального анализа сделать несколько горизонтальных линий. Значение типа double, может быть как положительным, так и отрицательным. indicator_levelcolor Определяет цвет горизонтальных линий-уровней индикатора в отдельном окне. Тип - color. indicator_levelwidth Определяет толщину горизонтальных линий-уровней индикатора. Значение - целое число в пикселях. indicator_levelstyle Определяет стиль горизонтальных линий-уровней индикатора. Тип - целое число. Можно использовать константы типа линий как у indicator_style. show_confirm Устанавливает нужно ли выводить окно подтверждения перед запуском скрипта. Используется только в пользовательских скриптах; в индикаторах и советниках игнорируется. show_inputs Устанавливает нужно ли выводить окно со свойствами перед запуском скрипта и запретить вывод окна подтверждения, т.е. если указан этот параметр, то параметр show_confirm игнорируется. Примеры: MQL#property link "http://forex.orotukan.ru/" #property copyright "Мои собственные права :)." #property library // это будет библиотека #property stacksize 1024 // ну очень глубокая рекурсия! :) #property indicator_chart_window // эти два параметра противоречат друг другу #property indicator_separate_window // и будет работать тот, который объявлен последним #property indicator_buffers 1 // будет 1 линия #property indicator_minimum 0 // линия будет бегать от 0 #property indicator_maximum 100 // до 100 #property indicator_color1 RED // линия будет красной #property indicator_width1 1 // толщина будет 1 пиксель потому, что будет пунктир #property indicator_style1 STYLE_DOT // укажем её пунктирной #property indicator_level1 50 // а по средине окна будет проведена тонкая линия #property indicator_levelcolor SILVER // она будет серебристая (светло-серая) #property indicator_levelwidth 1 // толщина 1 пиксель #property indicator_levelstyle STYLE_DOT // пунктирная #property show_confirm // это для скриптов - подтверждение запуска скрипта. #property show_inputs // или запрос ввода параметров
  25. 2. Команды препроцессора #define - объявление именованых констант. Эта конструкция может использоваться в любом месте модуля. Важно чтобы объявление было до использования константы, в противном случае будет ошибка компилляции. К именам констант применяются такие же требования как и к именам переменных (будет далее). Чаще всего имена констант делают ЗАГЛАВНЫМИ буквами. Таким образом они всегда выделяются в теле модуля Но это не обязательно. Пример: MQL#define МояКонстанта 2 Здесь определяется целое число 2 как МояКонстанта. При компилляции модуля везде константа МояКонстанта будет заменена на число 2. #property - специальные параметры скрипта/индикатора/советника Их много и им будет посвящён отдельный пост. #include - команда включения файла в текст модуля. Команда может встречаться в любом месте программы, но обычно все включения размешаются в начале файла исходного текста. Очень удобно для модульного написания индикаторов/советников. После компилляции модуля присутствие включённого файла не нужно (он был включён в скомпиллированный модуль). MQL#include <MyHeaders.mqh> #include "MyHeaders.mqh" Если имя файла заключено в угловые скобки (<>), то этот файл должен находиться в стандартном каталоге experts\include. Если имя файла заключено в кавычки, то файл должен находиться в текущем каталоге. #import - импорт исполняемых файлов. Эта команда позволяет полностью использовать вычислительные возможности компьютера. С помощью этой команды включаются скомпиллированные модули EX4 и системные библиотеки DLL. Более подробно и с примерами мы разберём в дальнейшем.
×
×
  • Создать...