Как сгенерировать сочетания без повторений с помощью тестера стратегий?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Igor Makanu
9539
Igor Makanu  

Есть такой скрипт, который генерирует сочетания  без повторений:

#property script_show_inputs
input int N = 
5;
#include <Files\FileTxt.mqh>
//+------------------------------------------------------------------+
void OnStart()
{
   CombinationsToFile(N);
}
//+------------------------------------------------------------------+
void CombinationsToFile(int size)
{
   int bases[];
   int len = ArrayResize(bases, size);
   CFileTxt f;
   string fname = (string)size + ".csv";
   if(f.Open(fname, FILE_WRITE | FILE_COMMON) > 0) Print("See result in Common\\Files\\", fname);
   else
   {
      Print("Error open file ", fname);
      return;
   }
//--- алгоритм сочетаний без повторений   
   for( int i = 0; i < len; i++ )
   {
      for( int j = 0; j < len; j++ ) bases[j] = j;
      for( ;; )
      {
         string s = "";
         for( int k = 0; k <= i; k++ ) s += (string) bases[k] + " ; ";
         f.WriteString(s+"\n");
         if(bases[0] + i == len ) break;
         for(int p = i; p >= 0; p-- )
         {
            if(bases[p] - p < len - i)
            {
               bases[p]++;
               if(p != i)
               {
                  for( int c = p; c < i; c++ ) bases[c + 1] = bases[c] + 1;
               }
               break;
            }
         }
      }
   }
}
//+------------------------------------------------------------------+

Скрипт работает исправно, пока проблем не замечал.


Как повторить этот же алгоритм, но с помощью тестера, чтобы тестер перебирал входные параметры:

input int param1 =  00;
input int param2 =  01;
input int param3 =  02;
input int param4 =  03;
input int param5 =  04;

int arr_param[5];
int arr_combination[];
//+------------------------------------------------------------------+
int OnInit()
{
   arr_param[0] = param1;
   arr_param[1] = param2;
   arr_param[2] = param3;
   arr_param[3] = param4;
   arr_param[4] = param5;
   
   return(INIT_SUCCEEDED);
}

и в массиве  arr_combination[] мне нужно получить каждый раз при проходе оптимизации одну из новых комбинации как в первом скрипте void CombinationsToFile(int size) 

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

ЗЫ: зачем это нужно - я начинал тут спрашивать https://www.mql5.com/ru/forum/321656/page68#comment_15459093

TheXpert
18276
TheXpert  
Igor Makanu:
long meta_param = param1 + 100*param2 + 100^2*param3 + 100^3*param4 + 100^4*param5

param1 = meta_param % 100;
param2 = (meta_param / 100) % 100;
//...
Igor Makanu
9539
Igor Makanu  
TheXpert:

повторов много будет, нужно хотя бы до 10 сочетаний без повторений 

попробовал свой скрипт, кажется он не все комбинации перебирает, но даже если для этого скрипта поставить N=10, то результат в файле 2046 строк, но повторов там нет

TheXpert
18276
TheXpert  
Igor Makanu:

повторов много будет, нужно хотя бы до 10 сочетаний без повторений

эээ это упаковка вообще без повторов ) с учетом того, что все параметры имеют значение от 0 до 99 чего нету в главном посте но есть по ссылке
Aleksey Mavrin
2715
Aleksey Mavrin  

Как я понимаю, эти целые - номера стратегий, и надо чтобы в портфеле они не повторялись?

Значит они берутся из общего пула? (а иначе смысла сочетания без повторений и не имеют ведь)

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

И закодить алгоритм чтоб от него находил уникальное сочетание по номеру.

Igor Makanu
9539
Igor Makanu  
Aleksey Mavrin:

Как я понимаю, эти целые - номера стратегий, и надо чтобы в портфеле они не повторялись?

Значит они берутся из общего пула? (а иначе смысла сочетания без повторений и не имеют ведь)

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

И закодить алгоритм чтоб от него находил уникальное сочетание по номеру.

не хотел дополнительной инфой перегружать топик, если по подробнее то примерно так:

- базовый ЕА оптится и сбрасывает удачные проходы в файл с настройками

- на основе базового ЕА создан ЕА без входных параметров, вернее входной параметр один - имя файла , в файле настройки всё и индикаторы и ММ и сопровождение ордеров и время торговли....

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

Имена файлов в Тотал командере переименовал от 00 до 99.bin и нужно теперь в тестер загружать различные комбинации вот этих названий файлов - сколько стратегий одновременно нужно - я не знаю, какие из них будут вместе давать хороший график - я не знаю... но тестер знает! 

ЗЫ: могу конечно в лоб решить задачу - сгенерировать файл - скрипт из первого поста и читать из него строки при оптимизации, в тестере будет один параметр оптимизации, для N=10 от 1 до 2046 строки


TheXpert:
эээ это упаковка вообще без повторов ) с учетом того, что все параметры имеют значение от 0 до 99 чего нету в главном посте но есть по ссылке

как писал, думал лишняя инфа будет отвлекать 

ну хотя бы так:

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

Aleksey Mavrin
2715
Aleksey Mavrin  
Igor Makanu:

ЗЫ: могу конечно в лоб решить задачу - сгенерировать файл - скрипт из первого поста и читать из него строки при оптимизации, в тестере будет один параметр оптимизации, для N=10 от 1 до 2046 строки

В вашем скрипте если в момент вместо записи нового сочетания инкремент счетчика делать и отдавать только значение в момент счетчика равного входному пар-ру (1 до 2046)

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

Igor Makanu
9539
Igor Makanu  
Aleksey Mavrin:

В вашем скрипте если в момент вместо записи нового сочетания инкремент счетчика делать и отдавать только значение в момент счетчика равного входному пар-ру (1 до 2046)

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

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

или не понято что Вы предлагаете - код дайте, запишите в файл из тестера значения которые Вы предлагаете


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

Dmitry Fedoseev
56785
Dmitry Fedoseev  
Непонятно в чем вопрос.
Aleksey Mavrin
2715
Aleksey Mavrin  
Igor Makanu:

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

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

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

грубо вместо

f.WriteString(s+"\n");
сделать
step++;if(step==Input) return s;
Igor Makanu
9539
Igor Makanu  
Aleksey Mavrin:

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

грубо вместо

нет, откуда тестер будет знать какой проход сейчас идет? агенты тестера между собой не могут общаться

нужно такую вот таблицу генерировать и прогонять в оптимизации, вот для N=4

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий