Не для разработчиков МТ! Чем заменить INIT_PARAMETERS_INCORRECT ? - страница 3

 
Georgiy Merts:

Это каким ? Заменой инкорректов ближайшими коректами ??? Боюсь, все зависит от того, как мы распределим эти самые инкорректы. Вполне возможно, что ближайшие корректы - будут находиться в стороне от вершины.

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

Честно, не вижу проблем. Однако, моя компетенция по обсуждаемому варианту нулевая.

 
fxsaber:

Думаю, по данным вопросам может помочь @Andrey Dik. Но даже конструктивная критика штатного ГА для него ничем хорошим не заканчивалась...

Забанен, к сожалению. Шлю лучи разбана Администрации, ну сколько можно?

 
Georgiy Merts:

А если написать функцию, которая бы выдавала только валидные цепочки по номеру ?

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

Нет, таблица с корректными цепочками получится значительно меньше, но даже если их будет 5000, то как их прописать и не запутаться?

 
Сергей Таболин:

Нет, таблица с корректными цепочками получится значительно меньше, но даже если их будет 5000, то как их прописать и не запутаться?

В файл сбросить. Далее смотрите номер прохода и сопоставляется с тем, что в файле.

 
fxsaber:

В файл сбросить. Далее смотрите номер прохода и сопоставляется с тем, что в файле.

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

 
Сергей Таболин:

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

input int i1 = 0; 
input int i2 = 0; 
input int i3 = 0; 

sinput int NumPass;

void OnTesterInit()
{
  int StopNumPass = 1;
  
  // Считали оптимизационные параметры входных
  // ...
  
  for (int _i1 = Start1; _i1 < Stop1; _i1 += Step1)
    for (int _i2 = Start2; _i2 < Stop2; _i2 += Step2)
      for (int _i3 = Start2; _i3 < Stop3; _i3 += Step3)
        if (CheckCorrect(_i1, _i2, _i3))
        {
          // записали проход в файл
          //...
          
          StopNumPass++; // см. ниже
        }
        
  // Сбросили оптимизацию входных и назначили NumPass от 1 до StopNumPass с шагом 1.
}


В этом примере результат будет сильно зависеть от того, в какой последовательности расположить циклы for. Все из-за этой особенности

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Не для разработчиков МТ! Чем заменить INIT_PARAMETERS_INCORRECT ?

fxsaber, 2018.07.10 16:27

Очевидно, что если следать полный перебор y = x^2. Затем рандомно перемешать строки опимизации и создать на основе перемешивания новый набор. То ГА не найдет вершину параболлы.

 

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

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

 
Склоняюсь к выводу, что проблема автора в архитектуре его программы.  
 
xFFFF:
Склоняюсь к выводу, что проблема автора в архитектуре его программы.  

Спасибо за мнение, только здесь не обсуждается архитектура программы. Если не заметили...

 
fxsaber:

Очевидно, что если следать полный перебор y = x^2. Затем рандомно перемешать строки опимизации и создать на основе перемешивания новый набор. То ГА не найдет вершину параболлы.

Накидал проверочный советник для мат. режима Оптимизатора

// #define TESTER_FILE // Советник будет работать не только на локальных Агентах, но и в Облаке.

#ifdef TESTER_FILE
// Нужно компилировать (не запускать) советник, когда этот файл (с любым содержанием, хоть пустой) лежит в Песочнице.
// Иначе Тестер не будет видеть эти данные, даже если соответствующий файл с ними положить после компиляции на место.  
  #property tester_file __FILE__ 
  
  const int FileCommon = 0;
#else
  const int FileCommon = FILE_COMMON;
#endif // TESTER_FILE

sinput bool Rand = false;     // Вкл/выкл. перемешивание
sinput int NumPass = 10001;   // Количество проходов

// Фитнесс-функция
double Func( const double X )
{
//  return(X); // Проверка, что Агенты считывают нужные данные
  return(-X * X + 1); // Парабола с максимальным значением в единице - его и будем искать
}

// Меняет местами элементы массива
template <typename T>
void Swap( T &Array[], const uint Pos1, const uint Pos2 )
{
  const T Tmp = Array[Pos1];
  
  Array[Pos1] = Array[Pos2];
  Array[Pos2] = Tmp;
}

// Возвращает случайный индекс массива
uint GetRandPos( const uint Size )
{
  return(MathRand() * (Size - 1) / SHORT_MAX);
}

// Перемешивает элементы массива
template <typename T>
void Mixing( T &Array[], const uint AmountIterations )
{
  const int Size = ArraySize(Array);

  MathSrand((uint)TimeLocal()); // Повторные запуски Оптимизатор будет игнорировать - build 1881
  
  for (uint i = 0; i < AmountIterations; i++)
    Swap(Array, GetRandPos(Size), GetRandPos(Size));
}

// Вычисляет интервал оптимизации
void SetInterval( double &Array[], const double Begin, const double End, const uint Amount )
{
  if (Amount > 1)
  {
    const double Step = (Begin - End) / (Amount - 1);
    double Tmp = End;
    
    for (int i = ArrayResize(Array, Amount) - 1; i >= 0; i--, Tmp += Step)    
      Array[i] = NormalizeDouble(Tmp, 8);
  }  
}

#define TOSTRING(A) #A

void OnTesterInit()
{
  ParameterSetRange(TOSTRING(NumPass), true, 0, 0, 1, NumPass - 1); // Задали Оптимизатору количество проходов = NumPass
  
  double Array[];
  
  SetInterval(Array, -1, 1, NumPass); // Выстроили значения интервала по порядку
  
  if (Rand)
    Mixing(Array, NumPass * 10); // Перемешали все в интервале
    
//  ArrayPrint(Array); // Проверка, что Агенты считывают нужные данные
    
  FileSave(__FILE__, Array, FileCommon); // Записали файл-интервал. А ведь так можно передать в Облако хоть содержимое всей Песочницы + полный стейтмент.
}

void OnTesterDeinit()
{
  if (FileCommon)
    FileDelete(__FILE__, FileCommon); // Удалили файл-интервал
  
  ChartClose(); // Закрыли чарт Frame-выполнения советника
}

double OnTester()
{
  double Array[];
  
  // Считали точку из интервала и вернули значение фитнесс-функции в ней
  return((FileLoad(__FILE__, Array, FileCommon) != -1) ? Func(Array[NumPass]): 0); // В режиме не-tester_file FileLoad будет выдавать ошибку, если два Агента одновременно обратятся.
}


Красным пометил уязвимости, слабые места и текущие ошибки MT5, что выявились при написании примера.

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