Jump to content
Programmer

Курс MQL4

Recommended Posts

Programmer

Урок 110 - Симметрия и ассиметрия валютной пары FOREX (Часть 5)

 

Всем привет' date='

 

В прошлом уроке мы были поставлены пере делемой выбора правильного подхода к оптимизации:

[b']Вариант 1:[/b] 10^4 проходов тестера ~ 2.7 часов; Однако, намного МЕНЕЕ правильный

Вариант 2: 10^8 проходов тестера ~ 3.2 года; Однако, намного БОЛЕЕ правильный

 

Также, мы установили, что генетический алгоритм, хоть и поможет быстрей пробежаться по небольшому подмножеству проходов Варинта 2, качество моделлирования заметно пострадает. Совсем не хочется жертвовать качеством оптимизации ради времени. Однако, при этом, конечно же, мы не можем ждать 3.2 года. Поэтому я предлагаю Вам рассмотреть третий вариант.

 

Вариант 3

Давайте разделим оптимизацию BUY и SELL сделок данного советника. Здесь мы подразумеваем, что эти две линии логики в советнике независимы. Это легко достижимо в большинстве советников, а также необходимость данного условия построения алгоритмов принятния решений естественным образом следует из рассуждений, касающихся ассимметрии советников, которые мы провели в предыдующих уроках.

 

Итак, мы сначала оптимизируем BUY, а затем SELL. В новом варианте необходимое количество проходов равно:

Вариант 3: 10x10x10x10 + 10x10x10x10 = 2x10^4 проходов тестера ~ 5.4 часов

 

Итак, мы смогли уменьшить количество проходов с 100,000,000 до 20,000, а время - с 3.2 лет до 5.4 часов. Все, что останется сделать после оптимизации в Варианте 3 - это склеить сет BUY и SELL, чтобы получить общий сет. На самом деле, это даже не обязательно делать, поскольку можно оставить BUY и SELL версии советника независимыми и запускать раздельно. Но это уже личный выбор каждого трейдера.

 

Вывод

Именно в этом и заключается второе преимущество ассиметричных советников:

1. Они имеют намного больше шансов на успех

2. При корректной (раздельной long-short оптимизации) время оптимизации возрастает не в квадрат раз, а лишь вдвое

 

И еще один бонус - в терминале МТ4 есть специальная опция, позволяющая оптимизировать только BUY или только SELL:

 

post-50854-1404220375,3956_thumb.jpg

Рис. 1 - Раздельная long-short оптимизация в МТ4

 

Еще раз замечу, что для того, чтобы данный подход работал корректно, советник должен быть разработан таким образом, чтобы сделки BUY и SELL совершались совершенно независимо. Например, часто советники не открывают новую сделку, пока не закроется старая. Независимость Long- и Short- логик означает, что открытая сделка на SELL не помешает открытию сделки на BUY. Если у Вас нет возможности модифицировать логику/код подобным образом, то единственный выход - запускать советник точно так же, как Вы его оптимизируете - как два разных советника. В одном случае указать long only, в другом - short only. Однако, советую быть предельно осторожными при использовании данных опций в реьланой торговле. Возможны непредвиденные побочные эффекты и всегда лучше заранее проконсультироваться с разработчиком / программистом советника.

 

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

 

До встречи на следующем уроке!

 

© Kirill. [email protected]

Share this post


Link to post
Share on other sites
Programmer

Урок 111 - Корректное тестирование индикаторов в тестере стратегий МТ4

 

Всем привет' date='

 

Недавно был озадачен вопросом об использовании функции OrdersTotal() в тестере стратегий. Достаточно интересная тема, которую мы сегодня и обсудим.

 

Напомню, из[i'] Урока 15 "Торговые Функции" [/i]мы знаем про функцию OrdersTotal():

 

20 - OrdersTotal()

Синтаксис:

int OrdersTotal( )

Описание:

Возвращает общее количество открытых и отложенных ордеров.

Параметры:

- отсутствуют -

 

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

 

Проблема

Проблема, к которой я пытался найти ответ заключается в следующем. Есть индикатор, который показывает уровни риска на счете. Т.е. индикатор смотрит, какие открыты в данный момент позиции / отложенники, и сообщает пользователю какова степень риска на счете. При попытке запустить индикатор на тестере стратегий (при тестировании какого-либо советника) индикатор показывал неверные значения. См. рисунок ниже:

 

 

post-50854-1404220389,5072_thumb.jpg

Рис. 1 - Ошибка индикатора при тестировании

 

 

Расследование

Как оказалось, проблема заключалась в том, что не все индикаторы могут верно работать на тестере стратегий. Например, MACD или MA (сключительно графические индикаторы) будут показывать то, что они должны, если их просто закинуть на график тестирования советника. А вот информативыне индикаторы, как тот, котороый я тестировал, могут работоть неверно. Дело в том, что они используют торговые функции, и функции информации по счету, поведение которых тестер моделирует только для тестируемого эксперта.

 

На самом деле, подсказка заключается в самом названии. "Тестер стратегий" - предназначен для тестирования тсратегий, а не индикаторов.

 

Решение

А что же тогда делать, если мы хотим протестировать именно индикатор?

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

 

post-50854-1404220389,5558_thumb.png

Рис. 2 - Корректное тестирование индикаторов в тестере стратегий

 

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

 

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

 

До встречи на следующем уроке!

 

© Kirill. [email protected]

Share this post


Link to post
Share on other sites
Programmer

Урок 112 - Выбор компьютера для оптимизации (Часть 1)

 

Всем привет,

 

Сегодня мы обсудим, как правильно подобрать компьютер именно под оптимизацию советников в терминале MetaTrader 4.

 

Тактовая частота процессора - Самая важная характеристика, на которую необходимо обратить внимание в первую очередь. Чем выше тактовая частота, тем больше совершается операций в секунду, а значит тем быстрей тестер будет отрабатывать каждый проход. Берем самую максимальную тактовую частоту, которую позволяют средства.

 

post-50854-1404220410,4165_thumb.gif

Рис. 1 - Тактовая частота

 

Многоядерность - Как известно, тестер МТ4 не предназначен на многопотоковую работу. Это значит, что не важно, один или два ядра у Вас в компьютере, или даже 16 ядер (например, 4 процессора по 4 ядра) - всегда тестером всегда будет задействован только один поток максимум, а значит и только одно ядро. Сейчас много процессоров выпускают 4х-ядерными, поэтому остановим наш выбор на четырех-ядерном процессоре.

 

post-50854-1404220410,4623_thumb.jpg

Рис. 2 - Многоядерный процессор

 

ОЗУ - Оперативная память практически не имеет значения. Если Вы собираетесь оптимизировать на всех тиках, то исходить необходимо из расчета примерно 2гб на каждый процессор (имперический результат). 4 процессоров - значит берем 8гб оперативной памяти максимум.

 

post-50854-1404220410,4918_thumb.jpg

Рис. 3 - ОЗУ

 

Охлаждение - Поскольку машина будет работать 24/7 кулинг должен быть первоклассным. Комьютер лушче поставить в чистый ящик с крышкой и отверстиями и фильтрами, чтобы ограничить доступ пыли.

 

post-50854-1404220410,5278_thumb.jpg

Рис. 4 - Охлаждение

 

Остальное - Видео/аудио/жеткий диск практически не имеют значения. Например лучше брать HDD а не SDD, т.к. HDD дешевле.

 

Осталось проследить, что у компьютера есть плата для подсоединения к интернет, и все готово. Например, я подобрал себе 4-х процессорную машину с Itel i5 @ 3.20 Ghz. Стоимость примерно 12 т.р.

 

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

 

До встречи на следующем уроке!

 

© Kirill. [email protected]

Share this post


Link to post
Share on other sites
Programmer

Урок 113 - Выбор компьютера для оптимизации (Часть 2)

 

Приветствую друзья,

 

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

 

Операционная система - убедитесь, что у Вас установлена Windows 64-bit, поскольку в 32-битных системах Windows пространство адресов может поддерживать только 4GB памяти в сумме. Часть из этого зарезервировано под BIOS и видео карточку.

 

Например, с 256-mb видео-картой Вы можете рассчитывать на примерно 3.3-3.5GB оперативной памяти (если у Вас физичкески стоит 4GB или более). Если же Ваша видео-карта имеет 1GB памяти, то оперативка будет задействована только до 2.6-2.8GB.

 

post-50854-1404220572,0139_thumb.jpg

Рис. 1 - Windows 64-бит

 

Рассосредоточение оптимизации

Самый эффективный способ задействовать все ядра в Вашем компьютере - это разбить поле оптимизации советника и запускать сразу несколько терминалов, оптимизируя различные части сета. Например, допустим, что в нашем советнике присутствуют три настраиваемых параметра:

A: 1,2,3,4

B: 22,44,55

C: 100,105,110,115,120

 

В таком случае, процесс оптимизации можно разбить на раздельные части следующим образом:

 

Терминал 1

A: 1

B: 22,44,55

C: 100,105,110,115,120

 

Терминал 2

A: 2

B: 22,44,55

C: 100,105,110,115,120

 

Терминал 3

A: 3

B: 22,44,55

C: 100,105,110,115,120

 

Терминал 4

A: 4

B: 22,44,55

C: 100,105,110,115,120

 

Как видите, разбиваем мы только по одному параметру. Остальные настройки оптимизации остаются одинаковыми. По завершении оптимизации результаты скливаются в экселе.

 

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

До встречи на следующем уроке!

 

© Kirill. [email protected]

Edited by Programmer

Share this post


Link to post
Share on other sites
Programmer

Урок 114 - Таблица приоритетов

 

Приветствую читатели,

 

Операторы ветвления, такиe как if и else, составляют значительную часть наших программ. Это явление больше это выражено в советниках, нежели индикаторах. Связано это с тем, что при торговле на FOREX и других финансовых рынках, алгоритмы и стратегии сводятся к принятию решений, что означает проверку условий: значений индикаторов, временных переменных, параметров состояния счета и пр.

 

В связи с этим, сегодня мы сосредоточимся на улучшении нашего понимания как именно проходят эти проверки. Поехали!

 

И сразу вопрос: как Вы думаете, какой реузльтат дает следующая логическая операция? True или False?



true || true && false || false

 

Как ни странно, вопрос нетривиален! Ведь, если сначала выполняются операторы ИЛИ (||), выражение равносильно следующему:



(true || true) && (false || false) -> true && false

 

что даст ответ False. А если сначала выполняются операторы И (&&), тогда выражение равносильно:

 

true || (true && false) || false -> true || false || false

 

 

которое вернет True. Так давайте проверим!

 

Скопируйте следующий код в новый скрипт, откомпилируйте и запустите его на любом графике:

 

int init()
{
  if(false || false && false || true)
     Alert("true");
  else
     Alert("false");
}

Что Вы видите? False!

С этим условием понятно. Давайте проверим еще следующие комбинации:

 

//(false && true || true)
//(true || true && false)
//(true || true && false || false)
//(false || false && false || true)

Как видите, все эти условия возвращают False.

 

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

 

post-50854-1404220675,3526_thumb.jpg

Рис.1 - Таблица приоритетов

 

 

Заметьте, что приоритеты различны для групп - чем выше группа в таблице, тем выше приоритет ВСЕХ операций внутри данной группы. Приоритет операций внутри каждой группы одинаковый.

 

В нашем случае, важны приоритеты логических операций && и ||. Поскольку операция || находится в группе, которая выше группы операции &&, то операция || будет выполняться первее операции &&. Однако, как Вы догадываетесь, это можно изменить с помощью скобок - из таблицы видно, что они всегда имеют самый высокий приоритет.

 

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

 

До встречи на следующем уроке!

 

© Kirill. [email protected]

Edited by Programmer

Share this post


Link to post
Share on other sites
Programmer

Урок 115 - Тренировка написания условий

 

Приветствую читатели,

 

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

 

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

 

Допустим, что у нас есть два условия: A, B. Что в таком случае представляет из себя следующая диаграмма? Какую комбинацию условий мы здесь видим?

 

post-50854-1404220765,7528_thumb.png

Рис.1 - Условие 1

Верно! Это комбинация A || B

А как насчет вот такой комбинации?



 

 

post-50854-1404220765,8115_thumb.png

Рис.2 - Условие 2

 

Супер! Это комбинация A && B

Давайте к ним добавим еще одно условие: С. Что нам говорит следующая диаграмма?

 

post-50854-1404220765,8619_thumb.png

Рис.3 - Условие 3

 

Это комбинация выражается как A && B && C

 

А как насчет следующей комбинации?

 

post-50854-1404220765,9106_thumb.png

Рис.4 - Условие 4

 

А вот эта комбинация посложнее. Она выражается как A || ( B && C ). Т.е. сначала мы берем пересечение B и C, а затем, к получившемуся условию добавляем A. Проверьте сами.

 

Кстати, эту же комбинацию можно представить в виде: ( A || B ) && ( A || C ). Здесь мы сначала поотдельности берем объединения A с каждым из условий B и C, а затем пересекаем получившиеся комбинации.

 

Таким образом, можно раскрывать скобки в условиях:

 

A || ( B && C ) = ( A || B ) && ( A || C )

 

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

 

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

- кроме первой пятницы месяца, и

- кроме всех часов после Stop_Hour_Friday во все другие пятницы, где Stop_Hour_Friday - заданная переменная

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

 

Вариант #1

int _DayOfWeekCheck() {
  if(
     (TimeDayOfWeek(TimeCurrent()) != 5) || TimeHour(TimeCurrent()) < Stop_Hour_Friday) //not last hours of Friday
     && (TimeDayOfWeek(TimeCurrent()) != 5) || TimeDay(TimeCurrent()) > 7)   //not first Friday of the month
  ) return (1);
  return (0);
}

 

 

Вариант #2

int _DayOfWeekCheck() {
  if(
     (TimeDayOfWeek(TimeCurrent()) != 5) || 
        (TimeHour(TimeCurrent()) < Stop_Hour_Friday //not last hours of Friday
         && TimeDay(TimeCurrent()) > 7)   //not first Friday of the month 
  ) return (1);
  return (0);
}

 

Данную функцию полезно использовать в алгоритмах, поскольку она сразу убивает двух зайцев:

- В первую пятницу каждого месяца всегда выходят новости по Non-Farm и Unemployment, которые очень часто вызывают спайки в котировках валютных пар. Не торгуя* в этот день, мы страхуемся от нежелаемых лоссов

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

 

*Замечание: не торгуя означает не открывая новые позиции. Сопровождать старые позиции (подтягивание стоп-лосса и закрытие) все же желательно совершать.

 

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

 

До встречи на следующем уроке!

 

© Kirill. [email protected]

Share this post


Link to post
Share on other sites
Programmer

Урок 116 - Виртуализация файлов Win 7

 

Приветствую друзья,

 

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

Проблема заключается в том, что в новом билде (сейчас уже 610) пользователи не могут найти свои файлы советников и индикаторов в папках терминала \MQL4\Experts и \MQL4\Indicators. На самом деле, данная проблема присутствовала и в старых билдах терминала, и связана она с устройством операционной системы Win7.

 

В отличие от WinXP, при некоторых настройках системы Win 7 не сохраняет файлы программы в ту же папку, где установлена сама программа. Например:

 

Вы устанавливаете программу, и она создает папку

C:\Program Files (x86)\MetaTrader4\

В XP все файлы сохранялись бы здесь или в соответствующих подпапках, например \experts\

 

Однако, в Win7 файлы будут сохраняться в следующей директории:

C:\Users\YourUserName\AppData\Local\VirtualStore\Program Files (x86)\MetaTrader4\

 

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

 

Самое интересное - это то, что Вы по-прежнему будете видеть файлы изнутри программы, более того, программа будет показывать, что файлы находятся в ее родной директории. Однако, когда Вы откроете папку программы через Windows Explorer, Вы не увидите этих файлов.

 

Как найти файлы? Решение достаточно простое. Для того, чтобы переключиться в папку, где находятся файлы, просто нажмите кнопку "Compatability Files", как указано на следующем рисунке:

 

post-50854-1404220839,3438_thumb.gif

Рис.1 - Совместимые файлы

 

Уточню, что по непонятным причинам, данная кнопка не всегда доступна. Например, я не стал устанавливать MT4 в стандартную папку /Program Files/, а установил в другое место. В результате, виртуализированные файлы находятся в директории:

C:\Users\YourUserName\AppData\Roaming\MetaQuotes\Terminal\64FE79054C7708168FB7D75074EFCCF1\MQL4\Scripts

 

В подобной ситуации можно найти виртуальную папку при сохранении файлов через опцию "Сохранить Как".

 

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

 

post-50854-1404220839,3836_thumb.png

Рис.2 - Режим совместимости

 

Сразу предупрежу, что Вы можете столкнуться с описанным поведением Windows 7, если Вы, например, используете MT4 на рабочем компьютере. Это связано с настройками безопасности, которые применяются многими компаниями. В подобных случаях, Вам потребуется пароль администратора, чтобы изменить настройки программы и установить режим совместимости.

 

Надеюсь, теперь Вы всегда будете знать, где искать Ваши файлы.

 

До встречи на следующем уроке!

 

© Kirill. [email protected]

Edited by Programmer

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×