Автооптимизация параметров советника

 
Добрый день, товарищи программисты и трейдеры, натыкался на статью Автоматическая оптимизация торгового робота в процессе реальной торговли там автооптимизатор был реализован при помощи второго терминала-тестера, я же решил написать автооптимизатор, без использования второго терминала и даже без внешних .dll библиотек.
И так, кратко о идее, в советник, через внешние переменные, задаются какие-то параметры для индикаторов, соответственно советник начинает торговать, если последующая закрытая сделка прибыльная, то параметры остаются, но если убыточная, то включается автооптимизатор, я его реализовал функцией, которая на вход принимает диапазон / диапазоны входных значений индикаторов, а на выходе  возвращает параметры, которые за заданный период, показали наибольший прирост, период автооптимизации задаётся так 
for(int y=bar_op+per_autoopt; y>=bar_cl; y--)
,где bar_op - бар открытия сделки, per_autoopt - период автооптимизации, bar_cl - бар закрытия сделки, т.е. выставляется какое-то кол-во баров в историю, от открытия сделки, и на этом периоде, открываются "ордера" по данным параметрам индикаторов. Я реализовал простую стратегию на одном индикаторе dpt6 (это гистограмма с 0 зоной), индикатор был выбран практически случайно, поэтому прошу не критиковать, стратегия проста: пересечение вверх - открытие покупки, закрытие продажи, пересечение вниз - открытие продажи, закрытие покупки.
Объяснять особо больше нечего, файлом я прикрепляю код, в котором всё есть и код индикатора. Естественно отвечу на любые вопросы по коду.

Теперь проблемы, с которыми я столкнулся в процессе

1. Язык mql4 поддерживает многомерные массивы максимум с 4мя измерениями, соответственно больше 4х параметров автооптимизировать не получится. К сожалению не работал плотно с .dll поэтому, решений этой проблемы пока не вижу, надеюсь на помощь опытных программистов .
2. Процесс перебора параметров реализован обычный в виде последовательного цикла, что при использовании пользовательских индикаторов / большом периоде авооптимизации / большом диапазоне параметров индикаторов занимает приличное время, по крайней мере, в тестере. Решение проблемы вижу в изменении вида поиска параметров, например, как в встроенном в MT4 оптимизаторе генетическом алгоритме или подобным, более рациональным видам поиска, надеюсь на помощь опытных программистов.

Спасибо за внимание, проект автооптимизатора, постоянно дорабатывается лично мною, но, как говориться, одна голова хорошо, а две......, поэтому решил узнать, мнение форумчан.
Оговорюсь, это моя первая тема на форуме, поэтому просьба строго не судить.
Если кому удобнее общаться по эл. почте, то вот моя bistreevseh@gmail.com
Либо, с теми, кто проживает в Санкт-Петербурге, готов лично встретиться, ибо, считаю личное общение, самым лучшим видом связи, об этом, прошу договариваться, также по эл. почте.

Файлы:
dpt_autoopt.mq4  10 kb
 
bistreevseh:
Добрый день, товарищи программисты и трейдеры, натыкался на статью Автоматическая оптимизация торгового робота в процессе реальной торговли там автооптимизатор был реализован при помощи второго терминала-тестера, я же решил написать автооптимизатор, без использования второго терминала и даже без внешних .dll библиотек.
И так, кратко о идее, в советник, через внешние переменные, задаются какие-то параметры для индикаторов, соответственно советник начинает торговать, если последующая закрытая сделка прибыльная, то параметры остаются, но если убыточная, то включается автооптимизатор, я его реализовал функцией, которая на вход принимает диапазон / диапазоны входных значений индикаторов, а на выходе  возвращает параметры, которые за заданный период, показали наибольший прирост, период автооптимизации задаётся так 
for(int y=bar_op+per_autoopt; y>=bar_cl; y--)
,где bar_op - бар открытия сделки, per_autoopt - период автооптимизации, bar_cl - бар закрытия сделки, т.е. выставляется какое-то кол-во баров в историю, от открытия сделки, и на этом периоде, открываются "ордера" по данным параметрам индикаторов. Я реализовал простую стратегию на одном индикаторе dpt6 (это гистограмма с 0 зоной), индикатор был выбран практически случайно, поэтому прошу не критиковать, стратегия проста: пересечение вверх - открытие покупки, закрытие продажи, пересечение вниз - открытие продажи, закрытие покупки.
Объяснять особо больше нечего, файлом я прикрепляю код, в котором всё есть и код индикатора. Естественно отвечу на любые вопросы по коду.

Теперь проблемы, с которыми я столкнулся в процессе

1. Язык mql4 поддерживает многомерные массивы максимум с 4мя измерениями, соответственно больше 4х параметров автооптимизировать не получится. К сожалению не работал плотно с .dll поэтому, решений этой проблемы пока не вижу, надеюсь на помощь опытных программистов .
2. Процесс перебора параметров реализован обычный в виде последовательного цикла, что при использовании пользовательских индикаторов / большом периоде авооптимизации / большом диапазоне параметров индикаторов занимает приличное время, по крайней мере, в тестере. Решение проблемы вижу в изменении вида поиска параметров, например, как в встроенном в MT4 оптимизаторе генетическом алгоритме или подобным, более рациональным видам поиска, надеюсь на помощь опытных программистов.

Спасибо за внимание, проект автооптимизатора, постоянно дорабатывается лично мною, но, как говориться, одна голова хорошо, а две......, поэтому решил узнать, мнение форумчан.
Оговорюсь, это моя первая тема на форуме, поэтому просьба строго не судить.
Если кому удобнее общаться по эл. почте, то вот моя bistreevseh@gmail.com
Либо, с теми, кто проживает в Санкт-Петербурге, готов лично встретиться, ибо, считаю личное общение, самым лучшим видом связи, об этом, прошу договариваться, также по эл. почте.


 

Файлы:
dpt6.ex4  8 kb
 

приветствую!

так получилось что мне тоже сейчас понадобилась оптимизация для своего нового проекта

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

касательно Ваших вопросов:

1. еще давно-давно рекомендовали как поступать с многомерностью:

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

как будто матрицу укладываем в один вектор только матрица многомерная

2. про методы оптимизации

простым перебором - слишком неэффективно, случайным поиском - очень тупо, нужен умный алгоритм 

в моем проекте тоже имеется многомерность поэтому сейчас решаю что выбрать 

раньше я немного освоился с библиотекой ALGLIB  https://www.mql5.com/ru/code/11077

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

а численной оптимизации в этой библиотеке я не нашел (может быть плохо искал?) 

зато есть нейросети, это может помочь

альтернатива - библиотека FANN https://www.mql5.com/ru/articles/1574

ну и наконец - генетика - есть интересная разработка: https://www.mql5.com/ru/code/9729

сейчас я потихоньку вкуриваю все три вышеперечисленных источника и думаю что лучше и проще

с удовольствием пообщаюсь на тему оптимизации итп

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

потому что профит в конкретной сделке может быть отчасти случайным в конце концов

 
transcendreamer:

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

как будто матрицу укладываем в один вектор только матрица многомерная

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

 
Meat:

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


согласен это конечно варварский метод но зато в рамках С без ООП

пользуясь случаем хочу спросить: - Алексей, а Ваш могучий индикатор chartbuilder будет обновляться?

под новыми билдами текущая версия уже не компилируется 

 
transcendreamer:


согласен это конечно варварский метод но зато в рамках С без ООП

пользуясь случаем хочу спросить: - Алексей, а Ваш могучий индикатор chartbuilder будет обновляться?

под новыми билдами текущая версия уже не компилируется 

Так тут об ООП речь как бы и не идёт. Хранение данных в структурах - это всё в рамках С.  Кроме того, там мы можем выделять память произвольного размера и использовать указатель на неё, собственно как и создаются многомерные динамические массивы. А вот в MQL нельзя создавать указатели на массивы.  Так что тут задача изначально сложнее, чем в настоящих языках программирования. А вы предлагаете ещё больше усугубить её и работать каменным топором :)  Ну т.е. в старом MQL4 так и приходилось работать каменным топором за неимением других орудий, но щас то зачем?

p.s. Chartbuilder уже в принципе готов, отлаживаю сейчас

 
Meat:

Так тут об ООП речь как бы и не идёт. Хранение данных в структурах - это всё в рамках С.  Кроме того, там мы можем выделять память произвольного размера и использовать указатель на неё, собственно как и создаются многомерные динамические массивы. А вот в MQL нельзя создавать указатели на массивы.  Так что тут задача изначально сложнее, чем в настоящих языках программирования. А вы предлагаете ещё больше усугубить её и работать каменным топором :)  Ну т.е. в старом MQL4 так и приходилось работать каменным топором за неимением других орудий, но щас то зачем?

p.s. Chartbuilder уже в принципе готов, отлаживаю сейчас

ну, я не профессиональный программист и даже не математик, а самоучка, удивлен что нельзя делать указатели на массивы, я вроде бы делал, или это уже получается автоматически в новой версии языка? возможно Вы дадите ссылку как правильно работать с мнргомерными массивами? я пока встречался с вариантом когда массив определялся как структура... про индикатор - отличная новость! думаю не я один жду этого обновления
 
transcendreamer:
ну, я не профессиональный программист и даже не математик, а самоучка, удивлен что нельзя делать указатели на массивы, я вроде бы делал, или это уже получается автоматически в новой версии языка? возможно Вы дадите ссылку как правильно работать с мнргомерными массивами? я пока встречался с вариантом когда массив определялся как структура... про индикатор - отличная новость! думаю не я один жду этого обновления

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

struct T1 { int a[]; }
struct T2 { T1 a[]; }
struct T3 { T2 a[]; }
struct T4 { T3 a[]; }

T3 Array3;  // массив с тремя измерениями

T4 Array4;  // массив с четырьмя измерениями

Это метод создания массива с фиксированным числом измерений. Если же требуется массив с произвольным числом измерений, то здесь уже потребуются методы ООП (рекурсивный класс и полиморфизм).

 
Meat:

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

Это метод создания массива с фиксированным числом измерений. Если же требуется массив с произвольным числом измерений, то здесь уже потребуются методы ООП (рекурсивный класс и полиморфизм).

только адресация элементов получается уж очень неудобная

например MATRIX[j].Set(total,MODEL[j]) - чтобы просто присвоить значение - ужос

"рекурсивный класс и полиморфизм" - качественный вынос мозга

с перегрузкой функций еще как-то разобрался, а  это что-то запредельное...

 
transcendreamer:

только адресация элементов получается уж очень неудобная

например MATRIX[j].Set(total,MODEL[j]) - чтобы просто присвоить значение - ужос


Ну можно всё сделать значительно удобней. Например для моего примера:

struct T1 { int a[];  void Set(int i, int V)             { a[i]=V; }           int Get(int i)             { return a[i]; }          };
struct T2 { T1 a[];   void Set(int i,int j, int V)       { a[i].Set(j,V); }    int Get(int i,int j)       { return a[i].Get(j); }   };
struct T3 { T2 a[];   void Set(int i,int j,int k, int V) { a[i].Set(j,k,V); }  int Get(int i,int j,int k) { return a[i].Get(j,k); } };

T3 Array;  // массив с тремя измерениями

И получим простой доступ к элементам:   Array. Set(n1, n2, n3, value)  и  Array.Get(n1, n2, n3).

Можно сделать ещё удобней, перегрузив оператор [], и будет доступ как к обычным элементам массива. Правда только на чтение, ибо для записи требуется чтобы функция возвращала ссылку на элемент, а MQL не поддерживает это.

 
Meat:


Ну можно всё сделать значительно удобней. Например для моего примера:

И получим простой доступ к элементам:   Array. Set(n1, n2, n3, value)  и  Array.Get(n1, n2, n3).

Можно сделать ещё удобней, перегрузив оператор [], и будет доступ как к обычным элементам массива. Правда только на чтение, ибо для записи требуется чтобы функция возвращала ссылку на элемент, а MQL не поддерживает это.


ой спасибо! вот что значит профессиональное знание!

возьму на вооружение