Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5. Издание 2-е, исправленное и дополненное - Тимур Машнин
Каждая следующая популяция формируется из предыдущей с помощью отбора, скрещивания и мутации.
Для отбора могут использоваться такие алгоритмы как рулетка, турнирный отбор и элитный отбор.
При применении рулетки, колесо рулетки делится на сектора, число которых совпадает с числом особей популяции.
Площадь каждого сектора пропорциональна вероятности воспроизведения особи популяции.
Отбор производится с помощью вращения колеса рулетки.
Таким образом, особь с наибольшим значением вероятности воспроизведения попадает в следующую популяцию наибольшее число раз.
Количество копий особи в следующей популяции определяется по формуле, как показано на слайде, где N — число особей в популяции.
При турнирном отборе из популяции случайно выбираются две особи, из которых остается особь с наибольшим значением вероятности воспроизведения.
При элитном отборе несколько лучших особей переходят в следующую популяцию без изменений, не участвуя в отборе и скрещивании.
После отбора идет скрещивание особей, при котором сначала выбираются две особи, затем случайно определяется точка разрыва в диапазоне числа параметров фитнес функции, после чего особи обмениваются сегментами хромосомы.
Само скрещивание производится с вероятностью ½.
При применении мутации, сначала случайно выбирается параметр фитнес функции, затем он модифицируется.
Сама мутация производится с вероятностью 0,001.
Библиотека UGAlib MQL5 Community реализации генетического алгоритма использует представление хромосомы в виде массива Chromosome, где 0 индекс это значение фитнес функции, а остальные индексы это параметры фитнес функции или гены хромосомы.
Оптимизация параметров фитнес функции ведется в одном диапазоне от RangeMinimum до RangeMaximum.
Поэтому если оптимизируемые параметры имеют разные диапазоны, их нужно привести к одному диапазону, как правило, от 0.0 до 1.0.
Популяция особей представлена двумерным массивом Population, где строки это хромосомы.
Популяция ранжируется по значению фитнес функции таким образом, что первый ее член имеет наилучшее значение фитнес функции по критерию оптимизации.
Популяция делится на две части.
Вначале вся популяция заселяется особями со случайно выбранными генами в диапазоне.
Затем для этих особей вычисляется значение фитнес функции, которое помещается в 0 индекс хромосомы.
При этом функция GetFitness расчета значения фитнес функции оперирует колонией потомков, представленной массивом Colony, имеющим размер в два раза меньший, чем размер популяции.
Таким образом, популяция заселяется двумя колониями потомков.
Колония потомков имеет размер меньший, чем размер популяции, для того, чтобы после мутаций и скрещиваний заселить ту часть популяции, которая имеет худшие значения фитнес функции.
При этом особи, полученные в результате мутаций и скрещиваний, заселяют именно колонию потомков.
После начального заселения популяции производится удаление дубликатов с помощью функции 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, а хэндлы