Читаем Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5. Издание 2-е, исправленное и дополненное полностью

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

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

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

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

Критерием улучшения служит эталонная хромосома — первая особь популяции.

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

В цикле заселения новой колонии потомков функции CycleOfOperators, операторы репликации, естественной мутации, искусственной мутации, заимствования генов и скрещивания выбираются случайно, в зависимости от их доли от 0 до 100.

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

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

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

Естественная мутация производится с помощью выбора одного родителя из популяции, используя алгоритм рулетки, и замены его генов генами, случайно выбранными в диапазоне от RangeMinimum до RangeMaximum.

Замена генов производится с вероятностью NMutationProbability от 0.0 до 100.0.

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

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

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

Полный код реализации генетического алгоритма можно посмотреть в файле UGAlib.

Для использования библиотеки UGAlib необходимо написать две функции FitnessFunction и ServiceFunction.

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

Функция ServiceFunction может выводить значение фитнес функции и остальные гены эталонной хромосомы при каждом проходе оптимизации.

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

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

Здесь мы добавили вычисление виртуального профита и счетчик выигрышных сделок.

Напишем фитнес функцию на основе этого индикатора.

Оптимизировать будем весы сигналов MA и MACD для получения максимального профита.

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

Здесь в функции OnStart скрипта мы вызываем главную функцию UGA генетического алгоритма, которая будет использовать написанные нами функции FitnessFunction и ServiceFunction во включаемом файле MAMACDFitness.

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

Используемый индикатор основан на применении классов CiMA и CiMACD, имеющих проблемы с глубиной истории, потому параметр size в фитнес функции не может быть большим.

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

Создадим классы сигналов CSignalMACDIndLow и CSignalMAIndLow.

В которых в методах LongCondition и ShortCondition мы будем использовать не классы CiMA и CiMACD, а хэндлы индикаторов.

Соответственно в индикаторе будем вызывать эти переписанные функции.

Включим этот переписанный индикатор в фитнес функцию.

И запустим скрипт.

Глубина истории увеличится, но при этом существенно увеличится и время оптимизации — на порядок, при том же самом результате на 1000 барах.

Поэтому для самооптимизации советника будем использовать первый вариант индикатора с глубиной истории в 1000 бар.

С помощью мастера MQL5 сгенерируем код советника на основе сигналов MA и MACD и добавим в него самооптимизацию параметров Signal_MA_Weight и Signal_MACD_Weight с использованием приведенной выше фитнес функции.

Перейти на страницу:

Похожие книги