Колония потомков имеет размер меньший, чем размер популяции, для того, чтобы после мутаций и скрещиваний заселить ту часть популяции, которая имеет худшие значения фитнес функции.
При этом особи, полученные в результате мутаций и скрещиваний, заселяют именно колонию потомков.
После начального заселения популяции производится удаление дубликатов с помощью функции 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 с использованием приведенной выше фитнес функции.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии