不适合MT开发者!用什么来代替INIT_PARAMETERS_INCORRECT? - 页 3

 
Georgiy Merts:

那是什么?通过用最接近的修正值替换不正确的值?恐怕这完全取决于我们如何分配这些相同的错误。很有可能,最近的修正--将远离顶部。

而结果是,我们将得到正确的结果,而不是错误的参数集--在我看来,这也是不应该做的--那么我们会发现什么?我们将得到一个最大值,而且它将有一个不正确的参数集 ?

坦率地说,我没有看到一个问题。然而,我对正在讨论的变体的能力是零。

 
fxsaber:

我认为@Andrey Dik 可以帮助解决这些问题。但是,即使是对常规的GA进行建设性的批评,对他来说也没有好结果......

遗憾的是,被禁止了。向行政部门发出解禁的光芒,那么,你还能坚持多久?

[删除]  
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循环的放置顺序。都是因为这个特殊性。

关于交易、自动交易系统和策略测试的论坛

不适合MT开发者!用什么来代替INIT_PARAMETERS_INCORRECT?

fxsaber, 2018.07.10 16:27

很明显,如果你追踪y=x^2的完整列举。然后随机洗刷优化行,并在洗刷的基础上创建一个新的集合。那么GA将无法找到抛物线的顶点。

 

不超过一个星期前,我因为一个类似的线程被禁止了一会儿,线程/调查被撕掉了,因为这是一个不必要的页面,有根基。

至于这个问题,我已经写过了,最好是排除所有被禁止的组合,这可以由开发人员优化完成,否则你需要做一个脚本,运行所有的组合,只把允许的组合保存到一个文件中,并已经用遗传学加载该文件进行优化。

 
我倾向于认为,作者的问题在于其方案的架构。
[删除]  
xFFFF:
我倾向于得出结论,作者的问题在于他的程序架构。

谢谢你的意见,但这里没有讨论方案的架构。如果你还没有注意到...

 
fxsaber:

很明显,如果你追踪y=x^2的完整列举。然后随机洗刷优化行,并在洗刷的基础上创建一个新的集合。GA将不会找到抛物线的顶部。

我已经为优化器的垫子模式创建了一个测试专家顾问

// #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的漏洞、弱点和当前错误。