// #define TESTER_FILE // Советник будет работать не только на локальных Агентах, но и в Облаке.#ifdef TESTER_FILE
// Нужно компилировать (не запускать) советник, когда этот файл (с любым содержанием, хоть пустой) лежит в Песочнице.// Иначе Тестер не будет видеть эти данные, даже если соответствующий файл с ними положить после компиляции на место. #property tester_file__FILE__constint FileCommon = 0;
#else
constint FileCommon = FILE_COMMON;
#endif // TESTER_FILEsinputbool Rand = false; // Вкл/выкл. перемешиваниеsinputint NumPass = 10001; // Количество проходов// Фитнесс-функцияdouble Func( constdouble X )
{
// return(X); // Проверка, что Агенты считывают нужные данныеreturn(-X * X + 1); // Парабола с максимальным значением в единице - его и будем искать
}
// Меняет местами элементы массиваtemplate <typename T>
void Swap( T &Array[], constuint Pos1, constuint Pos2 )
{
const T Tmp = Array[Pos1];
Array[Pos1] = Array[Pos2];
Array[Pos2] = Tmp;
}
// Возвращает случайный индекс массиваuint GetRandPos( constuint Size )
{
return(MathRand() * (Size - 1) / SHORT_MAX);
}
// Перемешивает элементы массиваtemplate <typename T>
void Mixing( T &Array[], constuint AmountIterations )
{
constint Size = ArraySize(Array);
MathSrand((uint)TimeLocal()); // Повторные запуски Оптимизатор будет игнорировать - build 1881for (uint i = 0; i < AmountIterations; i++)
Swap(Array, GetRandPos(Size), GetRandPos(Size));
}
// Вычисляет интервал оптимизацииvoid SetInterval( double &Array[], constdouble Begin, constdouble End, constuint Amount )
{
if (Amount > 1)
{
constdouble 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
voidOnTesterInit()
{
ParameterSetRange(TOSTRING(NumPass), true, 0, 0, 1, NumPass - 1); // Задали Оптимизатору количество проходов = NumPassdouble Array[];
SetInterval(Array, -1, 1, NumPass); // Выстроили значения интервала по порядкуif (Rand)
Mixing(Array, NumPass * 10); // Перемешали все в интервале// ArrayPrint(Array); // Проверка, что Агенты считывают нужные данныеFileSave(__FILE__, Array, FileCommon); // Записали файл-интервал.А ведь так можно передать в Облако хоть содержимое всей Песочницы + полный стейтмент.
}
voidOnTesterDeinit()
{
if (FileCommon)
FileDelete(__FILE__, FileCommon); // Удалили файл-интервалChartClose(); // Закрыли чарт Frame-выполнения советника
}
doubleOnTester()
{
double Array[];
// Считали точку из интервала и вернули значение фитнесс-функции в нейreturn((FileLoad(__FILE__, Array, FileCommon) != -1) ? Func(Array[NumPass]): 0); // В режиме не-tester_file FileLoad будет выдавать ошибку, если два Агента одновременно обратятся.
}
那是什么?通过用最接近的修正值替换不正确的值?恐怕这完全取决于我们如何分配这些相同的错误。很有可能,最近的修正--将远离顶部。
而结果是,我们将得到正确的结果,而不是错误的参数集--在我看来,这也是不应该做的--那么我们会发现什么?我们将得到一个最大值,而且它将有一个不正确的参数集 ?
坦率地说,我没有看到一个问题。然而,我对正在讨论的变体的能力是零。
我认为@Andrey Dik 可以帮助解决这些问题。但是,即使是对常规的GA进行建设性的批评,对他来说也没有好结果......
遗憾的是,被禁止了。向行政部门发出解禁的光芒,那么,你还能坚持多久?
编写一个只按数字输出有效链的函数如何?
首先想到的是一个117649个数值的表格,让遗传学在这个表格中寻找数字。
不,有有效链的表格会小得多,但即使有5000条链,我们怎么写才能不被混淆呢?
不,有正确链条的表格会小得多,但即使有5000条,你如何拼出它们而不被混淆?
向一个文件转储。然后查找通行证号码,并将其与文件中的内容相匹配。
进入文件重置。然后看到通行证号码,并将其与文件中的内容相匹配。
我的意思是如何在处方过程本身中不混淆、不重复、不遗漏?
我的意思是如何在这个过程本身中不被混淆,不被重复,不被错过?
在这个例子中,结果将在很大程度上取决于for循环的放置顺序。都是因为这个特殊性。
关于交易、自动交易系统和策略测试的论坛
不适合MT开发者!用什么来代替INIT_PARAMETERS_INCORRECT?
fxsaber, 2018.07.10 16:27
很明显,如果你追踪y=x^2的完整列举。然后随机洗刷优化行,并在洗刷的基础上创建一个新的集合。那么GA将无法找到抛物线的顶点。
不超过一个星期前,我因为一个类似的线程被禁止了一会儿,线程/调查被撕掉了,因为这是一个不必要的页面,有根基。
至于这个问题,我已经写过了,最好是排除所有被禁止的组合,这可以由开发人员优化完成,否则你需要做一个脚本,运行所有的组合,只把允许的组合保存到一个文件中,并已经用遗传学加载该文件进行优化。
我倾向于得出结论,作者的问题在于他的程序架构。
谢谢你的意见,但这里没有讨论方案的架构。如果你还没有注意到...
很明显,如果你追踪y=x^2的完整列举。然后随机洗刷优化行,并在洗刷的基础上创建一个新的集合。GA将不会找到抛物线的顶部。
我已经为优化器的垫子模式创建了一个测试专家顾问
我用红色 标出了写例子时出现的MT5的漏洞、弱点和当前错误。