Оптимизация. Граничные Условия Параметров

 

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

Проблема :Разные стратегии имеют разный набор по кол-ву и типам оптимизируемых параметров.

Решение:Нормировать все параметры к диапазону 0...1 или -1..+1, тогда задавая Тестеру этот диапазон перебора, модуль инициализации стратегий должен выбрать параметры из диапазона граничных условий для каждого параметра.

Минусы решения:

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

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

Таким образом классификация параметров стратегий будет такова*:

1. двоичные - булевы, два значения

2. Перечисления - несколько значений - по максимальному перечислению

3. Численные - int double  и т.д., потенц. бесконечное множество значений, по оптимальному кол-ву шагов между макс. и мин.

Как отсюда вытекает

Задача: Определить предварительно Граничные условия для каждого параметра каждой стратегии. может выполняться на основе суждений, предположений и/или предварительных тестов, проверок.

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

Интересно кто как решал подобные задачи, и вообще какие мысли? Особенно интересует подход к определению/заданию  ГУ.

Автоматизация поиска стратегий.
Автоматизация поиска стратегий.
  • 2016.04.04
  • www.mql5.com
Интересуют мысли трейдеров по поводу автоматизации поиска стратегий, не обязательно в пределах MQL4/5.
 
На каждую ТС задать свои параметры и запустить Оптимизацию.
 

проверяете параметры ЕА в OnInit() - если параметр вышел за границы возвращаете в OnInit() return(INIT_PARAMETERS_INCORRECT)

минус - если часто будет возвращаться return(INIT_PARAMETERS_INCORRECT) то начнет ломаться генетика оптимизатора

решение - используйте флаг и по срабатывании заканчивайте тестирование с помощью TesterStop()


ЗЫ:  или жертвуйте точностью , я так время работы ЕА для генетики делал, сначала время задавал через 2 шт double start = 18.01 double stop = 8.15 , перебирал по 0.01, затем по 0.1 , потом понял, что точное время можно потом подобрать путем вставки другого метода (ООП) и вообще стал использовать один ushort где байт на время старта и байт на время окончания торговли использую, а в коде уже уже преобразовываю в datetime - получилась точность 5 мин 40 сек на один бит, меня устраивает, да и перебрать в оптимизаторе всего 65535 значений, где то выкладывал пример на форуме, когда скорость тестирования улучшал

UPD: вот мой пример где ushort  на 2 байта разбиваю, чтобы время торговли подбирать https://www.mql5.com/ru/forum/1111/page2589#comment_13494345

 
fxsaber:
На каждую ТС задать свои параметры и запустить Оптимизацию.

На каждую в отдельности задать это же дофига) 100 стратегий по 10 параметров в каждой  получится 1000, а это экранов ндцать к примеру. Или вы имеете ввиду какую-то библиотеку или что?

 
Aleksey Mavrin:

На каждую в отдельности задать это же дофига) 100 стратегий по 10 параметров в каждой  получится 1000, а это экранов ндцать к примеру. Или вы имеете ввиду какую-то библиотеку или что?

Видимо, что-то не понимаю, раз столько ТС.

 
fxsaber:

Видимо, что-то не понимаю, раз столько ТС.

Пояснение: Я сделал декомпозицию общего вида стратегии на следующие элементы

- стратегия определения возможности  входа

- стратегия определения точки входа

- стратегия определения стоп-лосса

- стратегия определения цели по прибыли - установки тейка

- стратегия сопровождения - трейлинг-стоп

- стратегия сопровождения - управление объемом (доливка и\или сетка и/или частичное закрытие)

- стратегия сопровождения - определения досрочного выхода

Для каждого субэтапа принятия решений делаю коллекции элементарных (и не очень ) стратегий

И хочу перебрать все возможные сочетания каждый-с-каждым. Отсюда и такая заморочка.

 

оптимизатор переберет все параметры которые Вы укажете, как Вы сгруппируете... ему в принципе пофиг

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

ЗЫ:

вот можно посмотреть что генетика перебирает в параметрах оптимизации:

sinput string FileName  = "tst_optimization.txt";
input  short param_1    = 0;
input  short param_2    = 0;
input  short param_3    = 0;

#include <Files\FileTxt.mqh>

CFileTxt f;
uint pass;

int OnInit()
  {
   f.Open(FileName,FILE_READ|FILE_WRITE|FILE_COMMON);
   f.Seek(0,SEEK_END);
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   f.WriteString(IntegerToString(param_1)+";"+IntegerToString(param_2)+";"+IntegerToString(param_3)+"\n");
   f.Close();
  }

void OnTick()
  {
//---
   
  }

в папке Common\Files будет файл

 
Igor Makanu:


Про хитрости с типами данных я понял, удобная штука, пробовал. Про время только не совсем, у вас сов работал в течении дня по тем 5м40 сек, которые были в пар-ре ушорт или типа того, верно понял? В моем случае время было бы или перечислением если допустим не более 24 часа, или численным типом.

ГА пусть перебирает конечно. У меня же будет типы субстратегий перечислением.

Ваш скрипт навеял на мысль такую - в OnTester задать разные типы зависимостей между результатом и param_1    param_2 param_3

и посмотреть как ГА штатный находит максимумы. Наверняка кто-то так уже баловался)

 
Aleksey Mavrin:

Про хитрости с типами данных я понял, удобная штука, пробовал. Про время только не совсем, у вас сов работал в течении дня по тем 5м40 сек, которые были в пар-ре ушорт или типа того, верно понял? В моем случае время было бы или перечислением если допустим не более 24 часа, или численным типом.

ГА пусть перебирает конечно. У меня же будет типы субстратегий перечислением.

Ваш скрипт навеял на мысль такую - в OnTester задать разные типы зависимостей между результатом и param_1    param_2 param_3

и посмотреть как ГА штатный находит максимумы. Наверняка кто-то так уже баловался)

Мож, я чего опять толком не понимаю, но вот как делают разные умные дяди может подойдёт? А именно берут роботом выгружают историю в файл года за 2 за 3, можно сразу за 5 лет. Например, в csv файл. Потом пишут прогу на питоне или на си шарпе. Зачем такие извращения спросите Вы? На Си шарпу всё быстро обрабатывается, а такие дяди обычно всегда нервные и ждать не любят. Тем более можно сразу все ядра проца подключать и плюс GPU по самое не балуй заваливать. Да и ладно. Едем дальше. У на есть си шарп и данные. Пишем программу совы на си шарпе под наши данные. Там хоть двадцать, хоть тридцать параметров на оптимизацию. Запускаем генетический алгоритм и вуаля, она строит графики оптимальных решений для наших данных. Обана. Потом переносим матрицу коэффициентов в метак и радуемся жизни. Зачем это надо скажите Вы парень совсем больной, баны ему. Я согласен с Вами, что таких нужно держать по дальше от себя. Но только вот если задача решается раз в 5, а то и в 20 раз быстрее, а в случае с GPU может и в 100-200 раз быстрее, то может стоит прислушаться.

 
Aleksey Mavrin:

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

Проблема :Разные стратегии имеют разный набор по кол-ву и типам оптимизируемых параметров.

Решение:Нормировать все параметры к диапазону 0...1 или -1..+1, тогда задавая Тестеру этот диапазон перебора, модуль инициализации стратегий должен выбрать параметры из диапазона граничных условий для каждого параметра.

Минусы решения:

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

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

Есть ещё другой метод когда создаётся модель советника, например, в индикаторе. Что это за модель и зачем это нужно? Эта модель позволяет быстро вычислять результаты советника за пару лет простым циклом. Дальше уже изменяем параметры и непосредственно подгоняем. Фу скажите Вы какая дичь. Да зачем это нужно? Очень просто. Оптимизация будет проходит без загрузки тестера. Она может проходить каждые день или каждый час в роботе перед открытием позиции. Может скажите Вы весь кайф сидеть и ждать результатов в оптимизаторе советников. Да, конечно. Но те же самые графики можно строить прям на котировках ни чем не хуче оптимизатора. Тем более Вы уже сможете выбирать методы оптимизации, параметры на оптимизацию, да и увеличивать скорость вычисления передавая данные в dll, что тоже не мало важно. Ну а в dll уже будут все ядра проца, графические ядра, прочие вкусности. Метак даже если вывернется никак чего-то подобного теоретически не родит. Но, конечно, я не претендую на истину и решение всегда за Вами. 

 
Роман:


все что Вы пишете работает быстрее чем в МТ4 или если оптимизировать до 10 в 5-6 степени вариантов параметров, но если задача оптимизировать с помощью ГА количество вариантов  10 в 50-100 степени, то никакой С++/C# / Python не смогут обогнать МТ5, вернее нужно будет писать свои библиотеки распараллеливания вычислений при тестировании на исторических данных, тестер МТ5 это делает "из коробки" 

понятно, что тут дело вкуса, но по мне быстрее подключать готовые библиотеки из C# в MQL5, чем наоборот писать свой тестер в C# и там производить все расчеты - да и сомневаюсь, что один человек сможет полноценно повторить работу тестера МТ5


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

Причина обращения: